Array.asList vs ArrayList baru (Arrays.asList ())

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat perbedaan antara Arrays.asList (array) dan ArrayList (Arrays.asList (array)).

2. Array.asList

Mari kita mulai dengan metode Arrays.asList .

Dengan menggunakan metode ini, kita dapat mengonversi dari larik menjadi objek Daftar berukuran tetap . Ini Daftar hanya bungkus yang membuat array yang tersedia sebagai daftar. Tidak ada data yang disalin atau dibuat .

Selain itu, kami tidak dapat mengubah panjangnya karena menambahkan atau menghapus elemen tidak diperbolehkan .

Namun, kita dapat memodifikasi satu item di dalam larik. Perhatikan bahwa semua modifikasi yang kita buat pada satu item Daftar akan tercermin dalam larik asli kita :

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = Arrays.asList(stringArray); 

Sekarang, mari kita lihat apa yang terjadi jika kita memodifikasi elemen pertama stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D"); assertThat(stringArray).containsExactly("E", "B", "C", "D");

Seperti yang bisa kita lihat, array asli kita juga telah dimodifikasi. Baik list maupun array sekarang berisi elemen yang persis sama dalam urutan yang sama.

Sekarang mari kita coba memasukkan elemen baru ke stringList :

stringList.add("F");
java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111)

Seperti yang bisa kita lihat, menambahkan / menghapus elemen ke / dari Daftar akan menampilkan java.lang.UnsupportedOperationException .

3. ArrayList (Array.asList (larik))

Mirip dengan metode Arrays.asList , kita dapat menggunakan ArrayList (Arrays.asList (array)) saat kita perlu membuat List dari array .

Tapi, tidak seperti contoh kita sebelumnya, ini adalah salinan larik yang independen, yang berarti bahwa mengubah daftar baru tidak akan memengaruhi larik asli . Selain itu, kami memiliki semua kemampuan ArrayList biasa , seperti menambahkan dan menghapus elemen:

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = new ArrayList(Arrays.asList(stringArray)); 

Sekarang mari kita ubah elemen pertama stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D");

Dan sekarang, mari kita lihat apa yang terjadi dengan array asli kita:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

Seperti yang bisa kita lihat, array asli kita tetap tidak tersentuh .

Sebelum menutup, jika kita melihat kode sumber JDK, kita dapat melihat metode Arrays.asList mengembalikan jenis ArrayList yang berbeda dari java.util.ArrayList . Perbedaan utamanya adalah bahwa ArrayList yang dikembalikan hanya membungkus larik yang sudah ada - tidak mengimplementasikan metode tambah dan hapus .

4. Kesimpulan

Dalam artikel singkat ini, kami melihat perbedaan antara dua cara untuk mengonversi array menjadi ArrayList . Kami melihat bagaimana kedua opsi tersebut berperilaku dan perbedaan antara bagaimana mereka mengimplementasikan array internalnya.

Seperti biasa, contoh kode dapat ditemukan di GitHub.