Dari Ikhtisar Kerangka Kerja Koleksi :
Koleksi yang tidak mendukung operasi modifikasi (seperti
add
,remove
danclear
) disebut sebagai tidak dapat dimodifikasi . Koleksi yang tidak dapat dimodifikasi dapat dimodifikasi .Koleksi yang juga menjamin bahwa tidak ada perubahan pada
Collection
objek akan terlihat disebut tidak berubah . Koleksi yang tidak bisa diubah tidak bisa berubah .
Saya tidak bisa memahami perbedaannya.
Apa perbedaan antara tidak dapat dimodifikasi dan tidak berubah di sini?
sumber
list
. Jika sesuatu nanti bisa memanggillist.add(10)
makacoll
akan mencerminkan perubahan itu, jadi tidak, saya tidak akan menyebutnya tidak berubah.Pada dasarnya
unModifiable
Koleksi adalah pandangan, Jadi secara tidak langsung masih bisa 'dimodifikasi' dari beberapa referensi lain yang dapat dimodifikasi. Juga sebagai tampilan hanya baca koleksi annother, Ketika koleksi sumber berubah Koleksi tidak dapat diverifikasi akan selalu hadir dengan nilai-nilai terbaru.Namun
immutable
Koleksi dapat diperlakukan sebagai salinan hanya baca dari koleksi lain dan tidak dapat dimodifikasi. Dalam hal ini ketika kumpulan sumber berubah, Koleksi tidak berubah tidak mencerminkan perubahanBerikut adalah testcase untuk memvisualisasikan perbedaan ini.
Keluaran
sumber
modifiableList
danunModifiableList
peningkatanimmutableList
ukuran tidak berubahnew ArrayList<String>(modifiableList)
immutableList tidak dapat dimodifikasinew ArrayList<String>(modifiableList)
karenanew
? Terima kasih.Saya pikir perbedaan utamanya adalah bahwa pemilik koleksi yang dapat diubah mungkin ingin memberikan akses ke koleksi ke beberapa kode lain, tetapi menyediakan akses itu melalui antarmuka yang tidak memperbolehkan kode lain untuk memodifikasi koleksi (sambil menyimpan kemampuan itu ke kode yang dimiliki). Jadi koleksi tidak dapat diubah, tetapi pengguna tertentu tidak diizinkan untuk mengubah koleksi.
Tutorial Java Collection Wrapper dari Oracle mengatakan hal ini (penekanan ditambahkan):
sumber
Jika kita berbicara tentang JDK
Unmodifiable*
vs jambuImmutable*
, sebenarnya perbedaannya juga dalam kinerja . Koleksi yang tidak dapat diubah dapat menjadi lebih cepat dan lebih hemat-memori jika mereka bukan pembungkus koleksi biasa (implementasi JDK adalah pembungkus). Mengutip tim jambu :JDK menyediakan metode Collections.unmodifiableXXX, tetapi menurut kami, ini bisa
<...>
sumber
List.of(...)
memang menyalin dua kali!Mengutip Tutorial Java ™ :
(penekanan milikku)
Ini benar-benar merangkumnya.
sumber
Seperti disebutkan di atas yang tidak dapat dimodifikasi tidak seperti yang tidak dapat diubah karena koleksi yang tidak dapat dimodifikasi dapat diubah jika misalnya koleksi yang tidak dapat dimodifikasi memiliki koleksi delegasi yang mendasarinya yang dirujuk oleh beberapa objek lain dan objek mengubahnya.
Mengenai abadi, itu bahkan tidak didefinisikan dengan baik. Namun, secara umum itu berarti bahwa objek "tidak akan berubah", tetapi itu perlu didefinisikan secara rekursif. Sebagai contoh, saya dapat mendefinisikan tidak dapat diubah pada kelas yang variabel instan semuanya primitif dan yang metodenya tidak mengandung argumen dan mengembalikan primitif. Metode-metode kemudian secara rekursif memungkinkan variabel instan menjadi tidak dapat diubah dan semua metode mengandung argumen yang tidak dapat diubah dan yang mengembalikan nilai yang tidak dapat diubah. Metode harus dijamin untuk mengembalikan nilai yang sama dari waktu ke waktu.
Dengan asumsi kita bisa melakukan itu, ada juga konsep thread safe. Dan Anda mungkin dituntun untuk percaya bahwa kekekalan (atau tidak berubah seiring waktu) juga menyiratkan keamanan thread. Namun bukan itu masalahnyadan itulah poin utama yang saya sampaikan di sini yang belum dicatat dalam jawaban lain. Saya dapat membangun objek yang tidak berubah yang selalu mengembalikan hasil yang sama namun tidak aman untuk thread. Untuk melihat ini anggaplah bahwa saya membangun koleksi abadi dengan mempertahankan penambahan dan penghapusan dari waktu ke waktu. Sekarang koleksi abadi mengembalikan elemen-elemennya dengan melihat koleksi internal (yang mungkin berubah dari waktu ke waktu) dan kemudian (secara internal) menambah dan menghapus elemen-elemen yang ditambahkan atau dihapus setelah pembuatan koleksi. Jelas, meskipun koleksi akan selalu mengembalikan elemen yang sama, itu bukan thread aman semata karena tidak akan pernah mengubah nilai.
Sekarang kita dapat mendefinisikan immutable sebagai objek yang aman untuk thread dan tidak akan pernah berubah. Ada panduan untuk membuat kelas yang tidak dapat diubah yang umumnya mengarah ke kelas tersebut, namun perlu diingat bahwa mungkin ada cara untuk membuat kelas yang tidak dapat diubah, yang memerlukan perhatian pada keamanan utas, misalnya, seperti dijelaskan dalam contoh koleksi "snapshot" di atas.
sumber
Tutorial Java ™ mengatakan yang berikut:
Saya pikir ini penjelasan yang cukup baik untuk memahami perbedaannya.
sumber