Saya memutuskan untuk menulis daftar yang terhubung sendiri, dan mempunyai rencana untuk membuat struktur simpul yang terhubung internal tidak dapat diubah.
Tapi aku mengalami kesulitan. Katakanlah saya memiliki simpul tertaut berikut (dari addoperasi sebelumnya ):
1 -> 2 -> 3 -> 4
dan mengatakan saya ingin menambahkan 5.
Untuk melakukan ini, karena simpul 4tidak dapat diubah, saya perlu membuat salinan baru 4, tetapi ganti nextbidangnya dengan simpul baru yang mengandung a 5. Masalahnya sekarang, 3adalah merujuk yang lama 4; yang tanpa menambahkan 5. Sekarang saya perlu menyalin 3, dan mengganti nextbidangnya untuk referensi 4salinan, tetapi sekarang 2referensi yang lama 3...
Atau dengan kata lain, untuk melakukan penambahan, seluruh daftar tampaknya perlu disalin.
Pertanyaan saya:
Apakah pemikiran saya benar? Apakah ada cara untuk melakukan penambahan tanpa menyalin seluruh struktur?
Rupanya "Java Efektif" berisi rekomendasi:
Kelas harus abadi kecuali ada alasan yang sangat bagus untuk membuat mereka bisa berubah ...
Apakah ini kasus yang bagus untuk berubah-ubah?
Saya tidak berpikir ini adalah duplikat dari jawaban yang disarankan karena saya tidak berbicara tentang daftar itu sendiri; yang jelas harus bisa diubah agar sesuai dengan antarmuka (tanpa melakukan sesuatu seperti menyimpan daftar baru secara internal dan mengambilnya melalui pengambil. Pada pemikiran kedua, meskipun itu akan memerlukan beberapa mutasi; itu hanya akan dijaga agar tetap minimum). Saya sedang berbicara tentang apakah internal daftar harus tidak berubah.

CopyOnWritexxxdigunakan untuk multi-threading. Tidak ada yang mengharapkan koleksi menjadi benar-benar abadi (walaupun itu membuat beberapa kebiasaan)