Saya memiliki ArrayList
l1
ukuran 10. Saya menetapkan l1
jenis referensi daftar baru l2
. Akankah l1
dan l2
menunjuk ke ArrayList
objek yang sama ? Atau salinan ArrayList
objek yang ditugaskan l2
?
Saat menggunakan l2
referensi, jika saya memperbarui objek daftar, itu mencerminkan perubahan dalam l1
tipe referensi juga.
Sebagai contoh:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
Apakah tidak ada cara lain untuk menetapkan salinan objek daftar ke variabel referensi baru, selain membuat 2 objek daftar, dan melakukan salinan koleksi dari yang lama ke yang baru?
List.subList
untuk mendapatkan "tampilan" ke bagian daftar asli.(ArrayList<ArrayList<Object>>)
? akankah ini secara rekursif membuat salinan semua objek anak ArrayList?Coba gunakan
Collections.copy(destination, source);
sumber
new ArrayList<>(source);
?Collections.copy
sama sekali bukan alternatif untuknew ArrayList<>(source)
. Apa yangCollections.copy
sebenarnya dilakukan adalah berasumsi bahwadestination.size()
setidaknya sebesarsource.size()
, dan kemudian salin rentang indeks demi indeks menggunakanset(int,E)
metode. Metode ini tidak menambahkan elemen baru ke tujuan. Rujuk ke kode sumber jika tidak cukup jelas dari Javadoc.Ya
l1
danl2
akan menunjuk ke referensi yang sama, objek yang sama.Jika Anda ingin membuat ArrayList baru berdasarkan ArrayList lain, Anda melakukan ini:
Hasilnya akan
l1
tetap memiliki 2 elemen danl2
akan memiliki 3 elemen.sumber
List<String> l2 = new ArrayList<String>(l1)
danList<String> l2 = l1
?Cara mudah lain untuk menyalin nilai dari src ArrayList ke dest Arraylist adalah sebagai berikut:
Ini adalah penyalinan nilai aktual dan bukan hanya penyalinan referensi.
sumber
Ada metode addAll () yang akan melayani tujuan menyalin Satu ArrayList ke yang lain.
Misalnya Anda memiliki dua Daftar Array: sourceList dan targetList , gunakan kode di bawah ini.
targetList.addAll (sourceList);
sumber
Java tidak melewatkan objek, ia meneruskan referensi (pointer) ke objek. Jadi ya, l2 dan l1 adalah dua pointer ke objek yang sama.
Anda harus membuat salinan eksplisit jika Anda memerlukan dua daftar berbeda dengan konten yang sama.
sumber
List.copyOf
➙ daftar tidak dapat diverifikasiKamu bertanya:
Java 9 membawa
List.of
metode untuk menggunakan literal untuk membuatList
kelas konkret yang tidak dapat dimodifikasi .Bersamaan dengan itu kami juga mendapat
List.copyOf
. Metode ini juga mengembalikanList
kelas konkrit yang tidak dapat dimodifikasi .Yang dimaksud dengan "tidak dapat dimodifikasi" adalah jumlah elemen dalam daftar, dan referensi objek yang disimpan di setiap slot sebagai elemen, diperbaiki. Anda tidak dapat menambah, menjatuhkan, atau mengganti elemen. Tetapi referensi objek yang dipegang di setiap elemen bisa berubah atau tidak bisa berubah .
Lihat kode ini berjalan langsung di IdeOne.com .
Anda bertanya tentang referensi objek. Seperti yang dikatakan orang lain, jika Anda membuat satu daftar dan menetapkannya ke dua variabel referensi (pointer), Anda hanya memiliki satu daftar. Keduanya menunjuk ke daftar yang sama. Jika Anda menggunakan salah satu pointer untuk mengubah daftar, kedua pointer nantinya akan melihat perubahan, karena hanya ada satu daftar di memori.
Jadi, Anda perlu membuat salinan daftar. Jika Anda ingin salinan itu tidak dapat dimodifikasi, gunakan
List.copyOf
metode seperti yang dibahas dalam Jawaban ini. Dalam pendekatan ini, Anda berakhir dengan dua daftar terpisah, masing-masing dengan elemen yang memegang referensi ke objek konten yang sama. Sebagai contoh, dalam contoh kami di atas menggunakanString
objek untuk mewakili warna, objek warna melayang-layang di memori di suatu tempat. Kedua daftar memegang pointer ke objek warna yang sama. Ini adalah diagram.Daftar pertama
colors
dapat dimodifikasi. Ini berarti bahwa beberapa elemen dapat dihapus seperti yang terlihat dalam kode di atas, di mana kami menghapus elemen ke-3 asliChartreuse
(indeks 2 = ordinal 3). Dan elemen dapat ditambahkan. Dan elemen-elemen dapat diubah untuk menunjuk ke yang lainString
sepertiOliveDrab
atauCornflowerBlue
.Sebaliknya, keempat elemen tersebut
masterColors
adalah tetap. Tidak menghapus, tidak menambahkan, dan tidak mengganti warna lain. ItuList
implementasi unmodifiable.sumber