Saya punya ArrayList<String>
yang saya ingin mengembalikan salinan. ArrayList
memiliki metode klon yang memiliki tanda tangan berikut:
public Object clone()
Setelah saya memanggil metode ini, bagaimana cara mengembalikan Objek yang dikembalikan ArrayList<String>
?
Jawaban:
sumber
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
bukanArrayList<String>
di sisi kiri. Inilah cara koleksi harus digunakan sebagian besar waktu.Mengapa Anda ingin mengkloning? Membuat daftar baru biasanya lebih masuk akal.
Pekerjaan selesai.
sumber
ArrayList(Collection<? extends E> c)
berarti tidak masalah apa pun daftar yang Anda gunakan sebagai argumen.Ini adalah kode yang saya gunakan untuk itu:
Semoga bermanfaat bagi Anda
sumber
ArrayList
gunakanArrayList<YourObject>
ArrayList
konstruktor?Dengan Java 8 dapat diklon dengan stream.
...
sumber
toCollection
mungkin merupakan pilihan yang lebih baik.Maklum bahwa Object.clone () memiliki beberapa masalah besar, dan penggunaannya tidak disarankan dalam banyak kasus. Silakan lihat Butir 11, dari " Java Efektif " oleh Joshua Bloch untuk jawaban lengkap. Saya percaya Anda dapat menggunakan Object.clone () dengan aman pada array tipe primitif, tetapi selain itu Anda harus bijaksana dalam menggunakan dan meng-override clone secara benar. Anda mungkin lebih baik mendefinisikan konstruktor salinan atau metode pabrik statis yang secara eksplisit mengkloning objek sesuai dengan semantik Anda.
sumber
Saya pikir ini harus dilakukan dengan menggunakan API Koleksi:
Catatan : metode salin berjalan dalam waktu linier.
sumber
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Tampaknya menggunakancopyList.addAll(original);
adalah alternatif yang baikint
argumen misteri . Saya tidak tahu mengapa Anda ingin menggunakan metode statis yang tidak jelas ini, bukannya yang lamaaddAll
.Saya menemukan menggunakan addAll berfungsi dengan baik.
tanda kurung digunakan daripada sintaksis generik
sumber
new ArrayList<String>(original)
?Jika Anda menginginkan ini agar dapat mengembalikan Daftar dalam pengambil, akan lebih baik untuk melakukannya:
sumber
Untuk mengkloning antarmuka umum seperti
java.util.List
Anda hanya perlu melakukan itu. di sini Anda adalah contoh:Agak sulit, tetapi berfungsi, jika Anda terbatas untuk mengembalikan
List
antarmuka, jadi siapa pun setelah Anda dapat mengimplementasikan daftar Anda kapan saja dia mau.Saya tahu jawaban ini dekat dengan jawaban akhir, tetapi jawaban saya menjawab bagaimana melakukan semua itu saat Anda bekerja dengan-
List
orangtua generik - tidakArrayList
sumber
Berhati-hatilah saat mengkloning ArrayLists. Kloning di java adalah dangkal. Ini berarti bahwa itu hanya akan mengkloning Arraylist itu sendiri dan bukan anggotanya. Jadi jika Anda memiliki ArrayList X1 dan mengkloningnya ke X2 setiap perubahan dalam X2 juga akan bermanifestasi dalam X1 dan sebaliknya. Ketika Anda mengkloning, Anda hanya akan menghasilkan ArrayList baru dengan pointer ke elemen yang sama dalam aslinya.
sumber
Ini juga harus bekerja:
sumber
Perlu diingat bahwa ini hanya salinan dangkal bukan dalam, yaitu. Anda mendapatkan daftar baru, tetapi isinya sama. Ini bukan masalah untuk string saja. Lebih rumit ketika entri daftar adalah objek sendiri.
sumber
sumber
Saya bukan profesional java, tetapi saya memiliki masalah yang sama dan saya mencoba menyelesaikannya dengan metode ini. (Misalkan T memiliki copy constructor).
sumber
List
kelas implementasi memiliki konstruktor no-arg publik. Misalnya,List
kembali olehArray.asList
,List.of
atauList.subList
mungkin tidak.