1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kami akan menunjukkan cara yang berbeza untuk menyalin Senarai ke Senarai lain dan ralat umum yang dihasilkan dalam proses.
Untuk pengenalan penggunaan Koleksi , sila rujuk artikel ini di sini.
2. Pembina
Kaedah mudah untuk menyalin Senarai adalah dengan menggunakan konstruktor yang mengambil koleksi sebagai hujahnya:
List copy = new ArrayList(list);
Oleh kerana kami menyalin rujukan di sini dan tidak mengklon objek, setiap perubahan yang dibuat dalam satu elemen akan mempengaruhi kedua-dua senarai.
Atas sebab itu, menggunakan konstruktor adalah baik untuk menyalin objek yang tidak berubah:
List copy = new ArrayList(list);
Integer adalah kelas yang tidak dapat diubah, nilainya ditetapkan ketika instance dibuat dan tidak akan pernah berubah.
An Integer rujukan itu boleh dikongsi oleh beberapa senarai dan benang dan tidak ada cara yang sesiapa sahaja boleh menukar nilainya.
3. Senaraikan ConcurrentAccessException
Masalah yang biasa dilakukan dengan senarai adalah ConcurrentAccessException . Ini mungkin bermaksud kita mengubah suai senarai semasa kita berusaha menyalinnya, kemungkinan besar di rangkaian yang lain.
Untuk menyelesaikan masalah ini, kita mesti:
- Gunakan reka bentuk untuk koleksi akses serentak
- Kunci koleksi dengan betul untuk mengulanginya
- Cari kaedah untuk tidak perlu menyalin koleksi asal
Memandangkan pendekatan terakhir kami, ia tidak selamat. Oleh itu, jika kita ingin menyelesaikan masalah kita dengan pilihan pertama, kita mungkin ingin menggunakan CopyOnWriteArrayList , di mana semua operasi mutatif dilaksanakan dengan membuat salinan baru dari array yang mendasari.
Untuk maklumat lebih lanjut, sila rujuk artikel ini.
Sekiranya kita mahu mengunci Koleksi , mungkin menggunakan kunci primitif untuk membuat siri akses membaca / menulis, seperti ReentrantReadWriteLock .
4. TambahAll
Pendekatan lain untuk menyalin elemen adalah menggunakan kaedah addAll :
List copy = new ArrayList(); copy.addAll(list);
Penting untuk diingat setiap kali menggunakan kaedah ini bahawa, seperti pada konstruktor, kandungan kedua-dua senarai akan merujuk objek yang sama.
5. Koleksi.copy
The Collections kelas terdiri secara eksklusif daripada kaedah statik yang beroperasi pada koleksi pulangan atau.
Salah satunya adalah salinan , yang memerlukan senarai sumber dan senarai tujuan sekurang-kurangnya selagi sumbernya.
Ia akan mengekalkan indeks setiap elemen yang disalin dalam senarai tujuan seperti yang asal:
List source = Arrays.asList(1,2,3); List dest = Arrays.asList(4,5,6); Collections.copy(dest, source);
Dalam contoh di atas, semua elemen sebelumnya dalam senarai dest ditimpa kerana kedua-dua senarai mempunyai ukuran yang sama.
Sekiranya saiz senarai tujuan lebih besar daripada sumbernya:
List source = Arrays.asList(1, 2, 3); List dest = Arrays.asList(5, 6, 7, 8, 9, 10); Collections.copy(dest, source);
Hanya tiga item pertama yang ditimpa sementara elemen-elemen lain dalam senarai disimpan.
6. Menggunakan Java 8
Versi Java ini membuka kemungkinan kita dengan menambahkan alat baru. Yang akan kita terokai dalam contoh seterusnya ialah Stream :
List copy = list.stream() .collect(Collectors.toList());
Kelebihan utama cara ini adalah peluang untuk menggunakan langkau dan penapis. Dalam contoh seterusnya, kita akan melangkau elemen pertama:
List copy = list.stream() .skip(1) .collect(Collectors.toList());
Ada kemungkinan untuk menyaring dengan panjang tali juga atau dengan membandingkan atribut objek kami:
List copy = list.stream() .filter(s -> s.length() > 10) .collect(Collectors.toList());
List flowers = list.stream() .filter(f -> f.getPetals() > 6) .collect(Collectors.toList());
Ada kemungkinan kita mahu bekerja dengan cara yang selamat:
List flowers = Optional.ofNullable(list) .map(List::stream) .orElseGet(Stream::empty) .collect(Collectors.toList());
Dan langkau elemen menggunakan cara ini juga:
List flowers = Optional.ofNullable(list) .map(List::stream).orElseGet(Stream::empty) .skip(1) .collect(Collectors.toList());
7. Menggunakan Java 10
Akhirnya, salah satu versi Java terakhir membolehkan kita membuat Senarai yang tidak berubah yang mengandungi unsur-unsur Koleksi yang diberikan :
List copy = List.copyOf(list);
Satu-satunya syarat adalah bahawa Koleksi yang diberikan tidak boleh kosong, dan tidak boleh mengandungi unsur nol.