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

1. Gambaran keseluruhan

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

2. Arrays.asList

Mari kita mulakan dengan kaedah Arrays.asList .

Dengan menggunakan kaedah ini, kita dapat menukar dari array ke objek List berukuran tetap . Ini Senarai hanyalah pembalut yang membuat pelbagai yang ada sebagai satu senarai. Tidak ada data yang disalin atau dibuat .

Juga, kami tidak dapat mengubah panjangnya kerana penambahan atau penghapusan elemen tidak dibenarkan .

Walau bagaimanapun, kami dapat mengubahsuai item tunggal di dalam array. Perhatikan bahawa semua pengubahsuaian yang kami buat pada item tunggal dalam Senarai akan ditunjukkan dalam susunan asal kami :

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

Sekarang, mari kita lihat apa yang berlaku jika kita mengubah elemen stringList pertama :

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

Seperti yang kita lihat, susunan asal kita juga diubah. Kedua-dua senarai dan susunan sekarang mengandungi elemen yang sama persis dalam susunan yang sama.

Sekarang mari kita cuba 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 kita lihat, menambah / membuang elemen ke / dari Senarai akan membuang java.lang.UnsupportedOperationException .

3. ArrayList (Arrays.asList (array))

Sama dengan kaedah Arrays.asList , kita dapat menggunakan ArrayList (Arrays.asList (array)) ketika kita perlu membuat Daftar keluar dari array .

Tetapi, tidak seperti contoh kami sebelumnya, ini adalah salinan array yang bebas, yang bermaksud bahawa mengubah senarai baru tidak akan mempengaruhi array asal . Selain itu, kami mempunyai semua kemampuan ArrayList biasa , seperti menambahkan dan membuang 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 lihat apa yang berlaku dengan susunan asal kami:

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

Seperti yang kita dapat lihat, lokasi asal kita tidak terjejas .

Sebelum mengemas, jika kita melihat kod sumber JDK, kita dapat melihat kaedah Arrays.asList mengembalikan sejenis ArrayList yang berbeza dengan java.util.ArrayList . Perbezaan utama adalah bahawa ArrayList yang dikembalikan hanya membungkus array yang ada - ia tidak melaksanakan kaedah tambah dan buang .

4. Kesimpulan

Dalam artikel pendek ini, kami melihat perbezaan antara dua cara menukar array menjadi ArrayList . Kami melihat bagaimana kedua-dua pilihan tersebut berkelakuan dan perbezaan antara cara mereka melaksanakan susunan dalaman mereka.

Seperti biasa, contoh kod boleh didapati di GitHub.