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 add
operasi sebelumnya ):
1 -> 2 -> 3 -> 4
dan mengatakan saya ingin menambahkan 5
.
Untuk melakukan ini, karena simpul 4
tidak dapat diubah, saya perlu membuat salinan baru 4
, tetapi ganti next
bidangnya dengan simpul baru yang mengandung a 5
. Masalahnya sekarang, 3
adalah merujuk yang lama 4
; yang tanpa menambahkan 5
. Sekarang saya perlu menyalin 3
, dan mengganti next
bidangnya untuk referensi 4
salinan, tetapi sekarang 2
referensi 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.
CopyOnWritexxx
digunakan untuk multi-threading. Tidak ada yang mengharapkan koleksi menjadi benar-benar abadi (walaupun itu membuat beberapa kebiasaan)