Apakah ada keuntungan (atau banyak perbedaan) untuk menggunakan Arrays.asList (sesuatu) daripada Collections.singletonList (sesuatu) untuk membuat daftar yang berisi satu item? Yang terakhir membuat daftar yang dikembalikan juga tidak berubah.
Apakah ada keuntungan (atau banyak perbedaan) untuk menggunakan Arrays.asList (sesuatu) daripada Collections.singletonList (sesuatu) untuk membuat daftar yang berisi satu item? Yang terakhir membuat daftar yang dikembalikan juga tidak berubah.
Jawaban:
Collections.singletonList(something)
tidak dapat diubah sedangkan representasi Arrays.asList(something)
ukuran tetap List
dari Array tempat Daftar dan Array bergabung dalam heap.
Arrays.asList(something)
memungkinkan perubahan non-struktural dibuat untuk itu, yang akan tercermin ke Daftar dan array yang digabungkan. Itu melempar UnsupportedOperationException
untuk menambah, menghapus elemen meskipun Anda dapat mengatur elemen untuk indeks tertentu.
Setiap perubahan yang dilakukan pada Daftar yang dikembalikan oleh Collections.singletonList(something)
akan menghasilkan UnsupportedOperationException
.
Juga, kapasitas Daftar yang dikembalikan oleh Collections.singletonList(something)
selalu 1 tidak seperti Arrays.asList(something)
yang kapasitasnya akan sebesar array yang didukung.
Saya hanya ingin menambahkan bahwa singletonlist tidak didukung oleh array dan hanya memiliki referensi untuk satu item itu. Agaknya, itu akan memakan lebih sedikit memori dan dapat menjadi signifikan tergantung pada jumlah daftar yang ingin Anda buat.
Metode Arrays.asList
mengembalikan daftar ukuran tetap yang didukung oleh array yang ditentukan. Metode mengembalikan contoh ArrayList
yang merupakan kelas statis bersarang pribadi memperluas AbstractList
dan tidak java.util.ArrayList
. Kelas statis ini menyediakan implementasi beberapa metode, misalnya, set, indexOf, forEach, replaceAll
dll. Tetapi ketika kita memanggilnya add
tidak memiliki implementasi sendiri, melainkan metode dari AbstractList
dipanggil yang melempar java.lang.UnsupportedOperationException
.
The Collections.singletonList
pengembalian sebuah daftar kekal yang hanya berisi objek tertentu dan itu adalah serializable juga.
Sebagai catatan, untuk daftar yang tidak dapat diubah, kami biasanya menggunakan Collections.unmodifiableList
yang mengembalikan tampilan daftar yang tidak dapat dimodifikasi.
List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Koleksi tampilan yang tidak dapat dimodifikasi adalah koleksi yang tidak dapat dimodifikasi dan juga merupakan tampilan ke koleksi dukungan. Perhatikan bahwa perubahan pada koleksi dukungan mungkin masih dimungkinkan, dan jika terjadi, mereka dapat dilihat melalui tampilan yang tidak dapat dimodifikasi.
Kita dapat memiliki daftar abadi sejati di Java 10 dan yang lebih baru. Ada dua cara untuk mendapatkan daftar yang benar-benar tidak dapat dimodifikasi :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Jika salah satu dari dua variabel ini digunakan, nilai akan tetap menjadi "Apple" dan bukan "Apricot". Sebagai per doc dari Java 10 :
The
List.of
danList.copyOf
metode pabrik statis menyediakan cara yang nyaman untuk membuat daftar unmodifiable. Contoh instance yang dibuat oleh metode ini memiliki karakteristik berikut:
- Mereka tidak dapat dimodifikasi . Elemen tidak dapat ditambahkan, dihapus, atau diganti. Memanggil metode mutator pada Daftar akan selalu menyebabkan
UnsupportedOperationException
dilemparkan. Namun, jika elemen-elemen yang terkandung itu sendiri bisa berubah-ubah, ini dapat menyebabkan konten Daftar tampaknya berubah.- Mereka melarang elemen nol. Upaya untuk membuatnya dengan elemen nol menghasilkan
NullPointerException
.- Mereka dapat serial jika semua elemen serial.
- Urutan elemen dalam daftar sama dengan urutan argumen yang disediakan, atau elemen dalam array yang disediakan.
- Mereka adalah
value-based
. Penelepon tidak boleh membuat asumsi tentang identitas contoh yang dikembalikan. Pabrik bebas membuat instance baru atau menggunakan kembali yang sudah ada. Oleh karena itu, operasi sensitif-identitas pada instance ini (referensi kesetaraan (==), kode hash identitas, dan sinkronisasi) tidak dapat diandalkan dan harus dihindari.- Mereka serial seperti yang ditentukan pada halaman Formulir Serialized .
ImmutableList.of()
danLists.newArrayList()
campurannya juga.