Saya memiliki List<SomeBean>
yang terisi dari Layanan Web. Saya ingin menyalin / mengkloning isi daftar itu ke daftar kosong dengan tipe yang sama. Pencarian Google untuk menyalin daftar menyarankan saya untuk menggunakan Collections.copy()
metode. Dalam semua contoh yang saya lihat, daftar tujuan seharusnya berisi jumlah item yang tepat untuk penyalinan.
Karena daftar yang saya gunakan diisi melalui layanan web dan berisi ratusan objek, saya tidak dapat menggunakan teknik di atas. Atau saya salah menggunakannya !! Bagaimanapun, untuk membuatnya bekerja, saya mencoba melakukan sesuatu seperti ini, tetapi saya masih punya IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
Saya mencoba menggunakan wsListCopy=wsList.subList(0, wsList.size())
tetapi saya mendapat ConcurrentAccessException
kemudian dalam kode. Hit dan uji coba. :)
Bagaimanapun, pertanyaan saya sederhana, bagaimana saya bisa menyalin seluruh konten daftar saya ke Daftar lain? Bukan melalui iterasi, tentu saja.
sumber
app.allInOne(template)
?ArrayList
?Jawaban:
Gunakan ini saja:
Catatan: masih tidak aman utas, jika Anda memodifikasi
otherList
dari utas lain, maka Anda mungkin ingin membuatnyaotherList
(dan bahkannewList
) aCopyOnWriteArrayList
, misalnya - atau menggunakan kunci primitif, seperti ReentrantReadWriteLock untuk membuat serial akses baca / tulis ke daftar apa pun yang ada diakses bersamaan.sumber
ConcurrentAccessException
.Ini adalah cara Java 8 yang sangat bagus untuk melakukannya:
Tentu saja keuntungannya di sini adalah Anda dapat memfilter dan melompat ke hanya menyalin sebagian dari daftar.
misalnya
sumber
list
diubah saat kolektor berjalan, aConcurrentModificationException
dilemparkan..limit(list1.size() - 1)
Harap diingat setiap kali menggunakan metode addAll () untuk menyalin, isi dari kedua daftar array (originalArrayList dan copyArrayofList) referensi ke objek yang sama akan ditambahkan ke daftar jadi jika Anda memodifikasi salah satu dari mereka maka copyArrayofList juga akan mencerminkan perubahan yang sama.
Jika Anda tidak ingin efek samping, maka Anda perlu menyalin setiap elemen dari originalArrayList ke copyArrayofList, seperti menggunakan for atau while.
sumber
Ini berarti Anda memodifikasi daftar saat Anda mencoba menyalinnya, kemungkinan besar di utas lainnya. Untuk memperbaikinya Anda harus melakukannya juga
menggunakan koleksi yang dirancang untuk akses bersamaan.
kunci koleksi dengan tepat sehingga Anda dapat mengulanginya (atau memungkinkan Anda memanggil metode yang melakukan ini untuk Anda)
temukan jalan untuk menghindari keharusan menyalin daftar asli.
sumber
Mulai dari Jawa 10 :
List.copyOf()
mengembalikan yang tidak dapat dimodifikasi yangList
mengandung unsur-unsur yang diberikanCollection
.Yang diberikan
Collection
tidak bolehnull
, dan tidak boleh mengandung apa punnull
elemen .Juga, jika Anda ingin membuat salinan dalam
List
, Anda dapat menemukan banyak jawaban bagus di sini .sumber
Ada metode lain dengan Java 8 dengan cara null-safe.
Jika Anda ingin melewati satu elemen.
Dengan Java 9+, metode aliran Opsional dapat digunakan
sumber
Saya mengalami masalah yang sama ConcurrentAccessException dan solusi saya adalah untuk:
Jadi itu hanya berfungsi satu operasi pada saat itu dan menghindari Pengecualian ...
sumber
Saya mencoba sesuatu yang serupa dan dapat mereproduksi masalah (IndexOutOfBoundsException). Di bawah ini adalah temuan saya:
1) Implementasi Collections.copy (destList, sourceList) pertama-tama memeriksa ukuran daftar tujuan dengan memanggil metode size (). Karena metode panggilan ke ukuran () akan selalu mengembalikan jumlah elemen dalam daftar (0 dalam kasus ini), konstruktor ArrayList (kapasitas) memastikan hanya kapasitas awal dari array dukungan dan ini tidak memiliki hubungan dengan ukuran daftar. Karenanya kami selalu mendapatkan IndexOutOfBoundsException.
2) Cara yang relatif sederhana adalah dengan menggunakan konstruktor yang mengambil koleksi sebagai argumennya:
sumber
re
indexOutOfBoundsException
:, argumen sublist Anda adalah masalahnya; Anda harus mengakhiri sublist pada ukuran-1. Menjadi berbasis nol, elemen terakhir dari daftar selalu berukuran-1, tidak ada elemen dalam posisi ukuran, karenanya kesalahan.sumber
Anda dapat menggunakan addAll ().
misalnya:
wsListCopy.addAll(wsList);
sumber
Saya tidak dapat melihat jawaban yang benar. Jika Anda ingin salinan yang dalam, Anda harus mengulang dan menyalin objek secara manual (Anda dapat menggunakan copy constructor).
sumber
Jika Anda tidak ingin perubahan dalam satu daftar untuk efek daftar lain coba ini. Ini bekerja untuk saya.
Semoga ini bisa membantu.
sumber
Fungsi subList adalah trik, objek yang dikembalikan masih dalam daftar asli. jadi jika Anda melakukan operasi apa pun di subList, itu akan menyebabkan pengecualian bersamaan dalam kode Anda, tidak peduli itu satu utas atau multi utas.
sumber