Memanjangkan Panjang Array

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat pelbagai cara di mana kita dapat memperluas array Java.

Oleh kerana tatasusunan adalah sekumpulan memori yang berdekatan, jawapannya mungkin tidak begitu jelas, tetapi mari kita bongkar sekarang.

2. Menggunakan Arrays.copyOf

Pertama, mari kita lihat Arrays.copyOf . Kami akan menyalin susunan dan menambahkan elemen baru pada salinan:

public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) { Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1); destArray[destArray.length - 1] = elementToAdd; return destArray; }

Cara Arrays.copyOf berfungsi ialah mengambil srcArray dan menyalin bilangan elemen yang ditentukan dalam argumen panjang ke array baru yang dihasilkannya secara dalaman. Ukuran susunan baru adalah hujah yang kami sediakan.

Satu perkara yang perlu diperhatikan ialah apabila argumen panjang lebih besar daripada ukuran array sumber, Arrays.copyOf akan mengisi elemen tambahan dalam array tujuan dengan nol .

Bergantung pada jenis data, tingkah laku pengisian akan berbeza. Sebagai contoh, jika kita menggunakan jenis data primitif sebagai pengganti Integer maka elemen tambahan diisi dengan angka nol. Dalam kes char , Arrays.copyOf akan mengisi elemen tambahan dengan null dan jika boolean, dengan false .

3. Menggunakan ArrayList

Cara seterusnya yang akan kita lihat adalah menggunakan ArrayList.

Kami akan menukar array ke ArrayList terlebih dahulu dan kemudian menambahkan elemen. Kemudian kita akan menukar ArrayList kembali ke array :

public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; ArrayList arrayList = new ArrayList(Arrays.asList(srcArray)); arrayList.add(elementToAdd); return arrayList.toArray(destArray); }

Perhatikan bahawa kami telah lulus srcArray dengan menukarnya menjadi Koleksi. The srcArray akan mengisi pelbagai produk asas untuk ArrayList .

Juga, perkara lain yang perlu diperhatikan adalah bahawa kami telah menyampaikan array tujuan sebagai hujah kepada Array . Kaedah ini akan menyalin array yang mendasari ke destArray .

4. Menggunakan System.arraycopy

Akhirnya, kita akan melihat System.arraycopy , yang serupa dengan Arrays.copyOf :

public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; System.arraycopy(srcArray, 0, destArray, 0, srcArray.length); destArray[destArray.length - 1] = elementToAdd; return destArray; }

Satu fakta menarik adalah bahawa Arrays.copyOf secara dalaman menggunakan kaedah ini.

Di sini kita dapat melihat bahawa kita menyalin elemen dari srcArray ke destArray dan kemudian menambahkan elemen baru ke destArray .

5. Persembahan

Satu perkara yang biasa dalam semua penyelesaian adalah kita harus membuat susunan baru satu atau lain cara. Sebabnya terletak pada bagaimana susunan disusun dalam memori. Array mempunyai sekumpulan memori yang bersambung untuk pencarian yang sangat pantas, sebab itulah kita tidak boleh mengubah saiznya.

Ini tentu saja memberi kesan kepada prestasi, terutamanya untuk susunan yang besar. Inilah sebabnya mengapa ArrayList terlalu banyak memperuntukkan, dengan berkesan mengurangkan berapa kali JVM perlu mengagihkan semula memori.

Tetapi, jika kita melakukan banyak sisipan, array mungkin bukan struktur data yang tepat, dan kita harus mempertimbangkan LinkedList .

6. Kesimpulannya

Dalam artikel ini, kami telah meneroka pelbagai cara untuk menambahkan unsur ke hujung larik.

Dan, seperti biasa, keseluruhan kod tersedia di GitHub.