Salin Daftar ke Daftar Lain di Jawa

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menunjukkan berbagai cara untuk menyalin Daftar ke Daftar lain dan kesalahan umum yang dihasilkan dalam prosesnya.

Untuk pengantar penggunaan Koleksi , lihat artikel ini di sini.

2. Pembuat

Cara sederhana untuk menyalin Daftar adalah dengan menggunakan konstruktor yang mengambil collection sebagai argumennya:

List copy = new ArrayList(list);

Karena fakta bahwa kita menyalin referensi di sini dan tidak mengkloning objek, setiap perubahan yang dibuat dalam satu elemen akan memengaruhi kedua daftar.

Oleh karena itu, menggunakan konstruktor bagus untuk menyalin objek yang tidak dapat diubah:

List copy = new ArrayList(list);

Integer adalah kelas yang tidak dapat diubah, nilainya ditetapkan saat instance dibuat dan tidak pernah dapat berubah.

Sebuah Integer referensi sehingga dapat dibagi oleh beberapa daftar dan benang dan tidak ada cara orang bisa mengubah nilainya.

3. Buat daftar ConcurrentAccessException

Masalah umum yang bekerja dengan daftar adalah ConcurrentAccessException . Ini bisa berarti bahwa kami memodifikasi daftar saat kami mencoba menyalinnya, kemungkinan besar di utas lain.

Untuk memperbaiki masalah ini, kami harus:

  • Gunakan koleksi yang dirancang untuk akses bersamaan
  • Kunci koleksi dengan tepat untuk mengulanginya
  • Temukan cara untuk menghindari keharusan menyalin koleksi asli

Mempertimbangkan pendekatan terakhir kami, ini tidak aman untuk thread. Sehingga jika kita ingin menyelesaikan masalah kita dengan opsi pertama, kita mungkin ingin menggunakan CopyOnWriteArrayList , di mana semua operasi mutatif diimplementasikan dengan membuat salinan baru dari array yang mendasarinya.

Untuk informasi lebih lanjut, silakan merujuk ke artikel ini.

Jika kita ingin mengunci Collection , dimungkinkan untuk menggunakan kunci primitif untuk membuat serial akses baca / tulis, seperti ReentrantReadWriteLock .

4. AddAll

Pendekatan lain untuk menyalin elemen menggunakan metode addAll :

List copy = new ArrayList(); copy.addAll(list);

Penting untuk diingat setiap kali menggunakan metode ini, seperti pada konstruktor, konten kedua daftar akan mereferensikan objek yang sama.

5. Collections.copy

Kelas Koleksi secara eksklusif terdiri dari metode statis yang beroperasi pada atau mengembalikan koleksi.

Salah satunya adalah copy , yang membutuhkan daftar sumber dan daftar tujuan setidaknya sepanjang sumbernya.

Ini akan mempertahankan indeks dari setiap elemen yang disalin dalam daftar tujuan seperti aslinya:

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 di dest daftar yang ditimpa karena kedua daftar memiliki ukuran yang sama.

Jika ukuran daftar tujuan lebih besar dari sumber:

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, sedangkan elemen lainnya dalam daftar tersebut disimpan.

6. Menggunakan Java 8

Versi Java ini membuka kemungkinan kami dengan menambahkan alat baru. Yang akan kita jelajahi dalam contoh berikutnya adalah Stream :

List copy = list.stream() .collect(Collectors.toList());

Keuntungan utama dari cara ini adalah kesempatan untuk menggunakan lewati dan filter. Dalam contoh selanjutnya kita akan melewatkan elemen pertama:

List copy = list.stream() .skip(1) .collect(Collectors.toList());

Dimungkinkan untuk memfilter berdasarkan panjang String juga atau dengan membandingkan atribut objek kita:

List copy = list.stream() .filter(s -> s.length() > 10) .collect(Collectors.toList());
List flowers = list.stream() .filter(f -> f.getPetals() > 6) .collect(Collectors.toList());

Kemungkinan kami ingin bekerja dengan cara yang tidak aman:

List flowers = Optional.ofNullable(list) .map(List::stream)   .orElseGet(Stream::empty)   .collect(Collectors.toList());

Dan lewati 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

Terakhir, salah satu versi Java terakhir memungkinkan kita membuat List yang tidak dapat diubah yang berisi elemen Collection yang diberikan :

List copy = List.copyOf(list);
Satu-satunya ketentuan adalah Collection yang diberikan tidak boleh null, dan tidak boleh berisi elemen null apa pun.

8. Kesimpulan

Dalam artikel ini, kami telah mempelajari berbagai cara untuk menyalin Daftar ke Daftar lain dengan versi Java yang berbeda dan kesalahan umum yang dihasilkan dalam prosesnya. Seperti biasa, contoh kode dapat ditemukan di GitHub di sini dan di sini.