Pertanyaan Buat ArrayList dari array


Saya memiliki larik yang diinisialisasi seperti:

Element[] array = {new Element(1), new Element(2), new Element(3)};

Saya ingin mengonversi larik ini menjadi objek kelas ArrayList.

ArrayList<Element> arraylist = ???;

2963
2017-10-01 14:38


asal


Jawaban:


new ArrayList<>(Arrays.asList(array))

3962
2017-10-01 14:39



Diberikan:

Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };

Jawaban paling sederhana adalah:

List<Element> list = Arrays.asList(array);

Ini akan berfungsi dengan baik. Tetapi beberapa peringatan:

  1. Daftar kembali dari asList ukuran tetap. Jadi, jika Anda ingin dapat menambahkan atau menghapus elemen dari daftar yang dikembalikan dalam kode Anda, Anda harus membungkusnya dalam yang baru ArrayList. Kalau tidak, Anda akan mendapatkan UnsupportedOperationException.
  2. Daftar kembali dari asList() didukung oleh array asli. Jika Anda mengubah array asli, daftar akan diubah juga. Ini mungkin mengejutkan.

774
2017-10-01 15:39



(thread lama, tetapi hanya 2 sen karena tidak ada yang menyebutkan Guava atau lib lainnya dan beberapa detail lainnya)

Jika Bisa, Pakai Jambu

Ini perlu menunjukkan cara Guava, yang sangat menyederhanakan shenanigans ini:

Pemakaian

Untuk Daftar Yang Tidak Berubah

Menggunakan ImmutableList kelas dan itu of() dan copyOf() metode pabrik (elemen tidak boleh nihil):

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array

Untuk Daftar yang Dapat Berganti

Menggunakan Lists kelas dan itu newArrayList() metode pabrik:

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

Perhatikan juga metode serupa untuk struktur data lainnya di kelas lain, misalnya di Sets.

Mengapa Guava?

Daya tarik utama bisa untuk mengurangi kekacauan karena generik untuk keselamatan jenis, seperti penggunaan Guava metode pabrik izinkan jenis-jenis untuk disimpulkan sepanjang waktu. Namun, argumen ini memiliki lebih sedikit air sejak Java 7 tiba dengan operator berlian baru.

Tapi itu bukan satu-satunya alasan (dan Java 7 belum ada di mana-mana): sintaks singkatan juga sangat berguna, dan metode initializers, seperti yang terlihat di atas, memungkinkan untuk menulis kode yang lebih ekspresif. Anda lakukan dalam satu panggilan Guava apa yang membutuhkan 2 dengan Koleksi Java saat ini.


Jika Anda Tidak Bisa ...

Untuk Daftar Yang Tidak Berubah

Gunakan JDK Arrays kelas dan itu asList() metode pabrik, dibungkus dengan Collections.unmodifiableList():

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

Perhatikan bahwa jenis yang dikembalikan untuk asList() adalah List menggunakan beton ArrayList implementasi, tapi bukan itu  java.util.ArrayList. Ini adalah tipe batin, yang mengemulasi ArrayList tetapi sebenarnya referensi langsung array yang dilewati dan membuatnya "menulis melalui" (modifikasi tercermin dalam array).

Ini melarang modifikasi melalui beberapa List Metode API dengan cara hanya memperpanjang AbstractList (jadi, menambahkan atau menghapus elemen tidak didukung), namun memungkinkan panggilan ke set() untuk mengganti elemen. Jadi daftar ini tidak benar-benar berubah dan panggilan untuk asList() harus dibungkus dengan Collections.unmodifiableList().

Lihat langkah selanjutnya jika Anda memerlukan daftar yang bisa berubah.

Untuk Daftar Dapat Diubah

Sama seperti di atas, tetapi dibungkus dengan yang sebenarnya java.util.ArrayList:

List<String> l1  = new ArrayList<String>(Arrays.asList(array));    // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array));          // Java 1.7+
List<String> l2  = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b"));       // Java 1.7+

Untuk Keperluan Pendidikan: The Good ol 'Manual Way

// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
  final List<T> l = new ArrayList<T>(array.length);

  for (final T s : array) {
    l.add(s);
  }
  return (l);
}

// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
  final List l = new ArrayList(array.length);

  for (int i = 0; i < array.length; i++) {
    l.add(array[i]);
  }
  return (l);
}

295
2017-11-16 17:16



Karena pertanyaan ini cukup lama, itu mengejutkan saya bahwa tidak ada yang menyarankan bentuk yang paling sederhana:

List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));

Pada Java 5, Arrays.asList() mengambil parameter varargs dan Anda tidak perlu membuat array secara eksplisit.


203
2018-06-22 11:30



new ArrayList<T>(Arrays.asList(myArray));

Pastikan bahwa myArray adalah tipe yang sama dengan T. Anda akan mendapatkan kesalahan kompilator jika Anda mencoba membuat List<Integer>dari array int, sebagai contoh.


172
2017-10-01 14:40



Cara lain (meskipun pada dasarnya setara dengan new ArrayList(Arrays.asList(array)) solusi kinerja-bijaksana:

Collections.addAll(arraylist, array);

77
2018-04-03 23:20



Anda mungkin hanya perlu Daftar, bukan ArrayList. Dalam hal ini Anda hanya bisa melakukan:

List<Element> arraylist = Arrays.asList(array);

62
2017-10-01 14:45