1. Kaedah yang paling biasa (tidak semestinya yang terbaik)
Gunakan kaedah Arrays.asList(strArray) Selepas menukar tatasusunan kepada Senarai, anda tidak boleh menambah atau memadam Senaraikan, anda hanya boleh menyemak dan mengubah suai jika tidak membuang pengecualian.
Kod kunci: Senarai senarai = Arrays.asList(strArray);
private void testArrayCastToListError() { String[] strArray = new String[2]; List list = Arrays.asList(strArray); //对转换后的list插入一条数据 list.add("1"); System.out.println(list); }
Hasil pelaksanaan:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19) at com.darwin.junit.Calculator.main(Calculator.java:44)
Atur cara berada dalam list.add("1 ") Pada, pengecualian dilemparkan: UnsupportedOperationException.
Analisis sebab:
Nilai pulangan Arrays.asList(strArray) ialah kelas dalaman statik peribadi java.util.Arrays.ArrayList dalam kelas java.util.Arrays, yang bukan kelas java.util. Kelas java.util.Arrays.ArrayList telah set(), get(), contains() dan kaedah lain, tetapi tidak mempunyai kaedah add() atau remove(), jadi memanggil kaedah add() akan melaporkan ralat.
Senario penggunaan: Kaedah Arrays.asList(strArray) hanya boleh digunakan selepas menukar tatasusunan kepada Senarai Tidak perlu menambah atau memadam nilai di dalamnya. Ia hanya boleh digunakan sebagai data sumber untuk dibaca.
2. Selepas tatasusunan ditukar kepada Senarai, kaedah menambah, memadam, mengubahsuai dan menyemak disokong
Melalui pembina ArrayList, nilai pulangan bagi Arrays.asList(strArray) ditukar oleh java .util.Arrays.ArrayList ditukar kepada java.util.ArrayList.
Kod kunci: ArrayList
private void testArrayCastToListRight() { String[] strArray = new String[2]; ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ; list.add("1"); System.out.println(list); }
Hasil pelaksanaan: Elemen "1" berjaya ditambahkan.
[null, null, 1]
Senario penggunaan: Selepas menukar tatasusunan kepada Senarai, anda perlu menambah, memadam, mengubah suai dan menyemak Senarai Ini boleh digunakan apabila jumlah data dalam Senarai tidak besar.
3. Tukar melalui kaedah Collections.addAll() kelas alat koleksi (paling cekap)
Tukar melalui Collections.addAll(arrayList, strArray), mengikut kepanjangan tatasusunan Cipta Senarai dengan panjang yang sama, dan kemudian gunakan kaedah Collections.addAll() untuk menukar elemen dalam tatasusunan kepada binari dan kemudian menambahnya ke Senarai Ini adalah kaedah yang paling cekap.
Kod kunci:
ArrayList< String> arrayList = new ArrayList<String>(strArray.length); Collections.addAll(arrayList, strArray);
Ujian:
private void testArrayCastToListEfficient(){ String[] strArray = new String[2]; ArrayList< String> arrayList = new ArrayList<String>(strArray.length); Collections.addAll(arrayList, strArray); arrayList.add("1"); System.out.println(arrayList); }
Hasil pelaksanaan: Elemen "1" juga berjaya ditambahkan.
[null, null, 1]
Senario penggunaan: Selepas menukar tatasusunan kepada Senarai, anda perlu menambah, memadam, mengubah suai dan menyemak Senarai Apabila jumlah data dalam Senarai adalah besar, gunakannya dahulu, yang mana boleh meningkatkan kelajuan operasi.
Nota: Dilampirkan kod sumber kaedah Collections.addAll():
public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result return result; }
Soalan Jawab Soalan: Jika jenis tatasusunan ialah tatasusunan integer, adakah ralat akan dilaporkan apabila ia ditukar kepada Senarai?
Jawapan: Diuji dalam persekitaran JDK1.8, tiada masalah dengan ketiga-tiga kaedah penukaran ini. Gunakan dengan yakin. Kaedah dan keputusan ujian untuk menukar tatasusunan integer Integer[] kepada Senarai adalah seperti berikut:
Kaedah 1: Penambahan dan pemadaman tidak disokong
Integer[] intArray1 = new Integer[2]; List<Integer> list1 = Arrays.asList(intArray1); System.out.println(list1);
Hasil berjalan :
[null, null]
Kaedah 2: Menyokong penambahan dan pemadaman
Integer[] intArray2 = new Integer[2]; List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(intArray2)) ; list2.add(2); System.out.println(list2);
Jalankan hasil:
[null, null, 2]
Kaedah 3: Menyokong penambahan dan pemadaman, dan jumlah data adalah besar Yang paling cekap
Integer[] intArray3 = new Integer[2]; List<Integer> list3 = new ArrayList<Integer>(intArray3.length); Collections.addAll(list3, intArray3); list3.add(3); System.out.println(list3);
Hasil yang sedang dijalankan:
[null, null, 3]
Ringkasnya, menukar tatasusunan integer Integer[] ke Senarai
adalah mudah Ralat: Ralat yang mungkin boleh ditukar seperti ini:
int[] intArray1 = new int[2]; List<Integer> list1 = Arrays.asList(intArray1);//此处报错!!!
Sebab ralat: Jenis pada kedua-dua belah tanda sama adalah tidak konsisten, dan sudah tentu kompilasi tidak akan lulus. Lihat di bawah untuk analisis.
Jadi apabila mengisytiharkan tatasusunan, patutkah anda menggunakan int[] atau Integer[], kaedah pengisytiharan manakah yang boleh menukarnya dengan betul kepada Senarai?
Jawapan: Anda hanya boleh menggunakan Integer[] untuk menukar Senarai
Sebabnya dianalisis seperti berikut:
Mari kita lihat definisi Senarai dalam kod sumber Java (jangan takut anda tidak dapat memahami kod sumber, tonton analisis saya, ia sangat mudah difahami):
public interface List<E> extends Collection<E> {省略…}
Mari lihat definisi kod sumber Java bagi Arrays.asList():
public static List asList(T... a) { return new ArrayList<>(a); }
Seperti yang dapat dilihat daripada kod sumber di atas, Apabila mengisytiharkan Senarai, anda perlu lulus generik
Apakah jenis rujukan ? Integer ialah jenis rujukan, jadi apakah jenis int ialah jenis data asas, bukan jenis rujukan. Inilah sebabnya mengapa tiada Senarai dalam Java
Buat inferens tentang kes lain: 8 jenis data asas lain bait, pendek, int, panjang, apungan, berganda dan char bukan rujukan jenis, jadi 8 jenis data asas Tiada jenis data boleh digunakan sebagai parameter rasmi Senarai. Walau bagaimanapun, Rentetan, tatasusunan, kelas dan antara muka ialah jenis rujukan dan boleh digunakan sebagai parameter rasmi Senarai, jadi terdapat Senarai
Dengan pengetahuan asas di atas, mari lihat sebabnya dua baris kod berikut ialah Baris kedua berjaya menyusun, tetapi baris ketiga menyusun dan melaporkan ralat
int[] intArray1 = new int[1]; Arrays.asList(intArray1);//编译不报错 List<Integer> list1 = Arrays.asList( intArray1);//编译报错
Jawapan:
Barisan kedua? kod, parameter input kaedah Arrays.asList() Ia adalah jenis rujukan int[], maka jenis nilai pulangan mestilah Senarai
Baris ketiga melaporkan ralat kerana jenis pada kedua-dua belah tanda sama adalah tidak konsisten Bahagian kiri: Senarai
Atas ialah kandungan terperinci Bagaimana untuk menukar tatasusunan ke Senarai dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!