Baru -baru ini, saya meluangkan waktu untuk menganalisis metode ASLIST dari kelas alat Java Arrays, memilah informasi yang relevan secara online, dan merekamnya, berharap dapat membantu pembaca!
Kelas alat array menyediakan metode aslist, yang menggunakan metode ini untuk mengonversi parameter panjang variabel atau array menjadi daftar.
Kode sumber adalah sebagai berikut:
/*** Mengembalikan daftar ukuran tetap yang didukung oleh array yang ditentukan. (Perubahan ke * daftar yang dikembalikan "Tulis melalui" ke array.) Metode ini bertindak * sebagai jembatan antara API berbasis array dan berbasis koleksi, dalam kombinasi * dengan {@link collection#toarray}. Daftar yang dikembalikan adalah * serializable dan mengimplementasikan {@link acakAccess}. * * <p> Metode ini juga menyediakan cara yang nyaman untuk membuat daftar * ukuran tetap yang diinisialisasi untuk berisi beberapa elemen: * <pr Pre> * Daftar <string> stand = arrays.aslist ("Larry", "Moe", "Curly"); * </pr Pre> * @param A Array dimana daftar akan didukung * @return tampilan daftar array yang ditentukan */ @safevarargs statis public <t> Daftar <T> aslist (t ... a) {return new ArrayList <> (a); }Penemuan masalah
Berdasarkan deskripsi metode di atas, mari kita tulis beberapa contoh pertama:
/***@author wangmengjun**/kelas publik arrayexample {public static void main (string [] args) {/** Gunakan parameter panjang variabel*/daftar <string> array1 = arrays.aslist ("selamat datang", "untuk", "java", "dunia"); System.out.println (array1); / ** Gunakan array*/ daftar <string> array2 = arrays.aslist (string baru [] {"selamat datang", "ke", "java", "world"}); System.out.println (array2); }}Jalankan program di atas dan output konten berikut.
[Selamat datang, ke, Java, dunia]
[Selamat datang, ke, Java, dunia]
Atas kemauan, saya tiba -tiba ingin menambahkan string "keren ~~~" ke daftar yang dibuat dan pergi.
/ ** Gunakan parameter panjang variabel*/ daftar <string> array1 = arrays.aslist ("selamat datang", "ke", "java", "dunia"); array1.add ("keren ~~~");Akibatnya, Exception yang tidak didukung ditemui:
Pengecualian di Thread "Main" java.lang.unsupportedOperationException di java.util.abstractlist.add (sumber yang tidak diketahui) di java.util.abstractlist.add (sumber yang tidak diketahui) di test.arrayexample.main (arrayexample.java:36) di test.arrayexample.main (arrayexample.java:36)) di test.arrayexample.main (arrayexample.java:36)) di test.arrayexample.main (arrayexample.java:36))
Hebatnya, daftar yang dihasilkan oleh ArrayList baru <> (a) sebenarnya menghadapi masalah.
Alasan pencarian
Jadi pertanyaannya adalah, apa sebenarnya yang terjadi? Dengan pertanyaan, periksa seperti apa daftar array yang digunakan dalam array.
Ternyata kelas ArrayList yang digunakan oleh metode array ASLIST adalah kelas yang ditentukan secara internal, bukan kelas java.util.arraylist.
Kode sumber adalah sebagai berikut:
/ ** * @serial termasuk */ Private Static Class ArrayList <E> memperluas AbstractList <E> mengimplementasikan acak, java.io.serializable {private static final long serialversionuid = -2764017481108945198l; final private e [] a; ArrayList (e [] array) {if (array == null) lempar nullpointerException baru (); a = array; } public int size () {return A.Length; } objek publik [] toArray () {return a.clone (); } public <t> t [] toArray (t [] a) {int size = size (); if (a.length <size) return arrays.copyof (this.a, size, (class <? Extends t []>) a.getClass ()); System.arraycopy (this.a, 0, a, 0, size); if (a.length> size) a [size] = null; mengembalikan a; } public e get (int index) {return a [index]; } public e set (indeks int, elemen e) {e oldValue = a [index]; a [index] = elemen; Kembalikan OldValue; } public int indexof (objek o) {if (o == null) {for (int i = 0; i <a.length; i ++) if (a [i] == null) return i; } else {for (int i = 0; i <a.length; i ++) if (o.equals (a [i])) return i; } return -1; } public boolean berisi (objek o) {return indexof (o)! = -1; }}Dari implementasi arraylist kelas dalam ini, dapat dilihat bahwa ia mewarisi kelas abstrak java.util.abstractlist <E>, tetapi metode add dan hapus tidak diganti, dan implementasi spesifik tidak diberikan.
Namun, secara default, kelas java.util.AbstractList akan langsung melempar UncupportedOpersException di ADD, atur dan hapus metode. Beberapa kode sumber abstractlist adalah sebagai berikut:
Kelas Abstrak Publik AbstractList <E> Memperluas AbstractCollection <E> mengimplementasikan Daftar <E> { /*** konstruktor tunggal. (Untuk doa oleh konstruktor subkelas, biasanya * implisit.) */ AbstractList yang dilindungi () {} set publik (indeks int int, elemen e) {lempar baru unsupportedOpersException (); } /** * {@inHeritDoc} * * <p> Implementasi ini selalu melempar * {@code UnsupportedOperationException}. * * @Throws UnsupportedOperationException {@inHeritDoc} * @throws ClasscastException {@inHeritDoc} * @throws nullpointException {@inHeritDoc} @throws @throws @thowsception {@inHeritDoc} * @throws @throws @showsception {@inHeritDoc} * @throws @thowsception {nthrows {nthrows {inHeritDoc @throws {NTHROWSCEXCEXCEPTION {NTHROW { indeks, elemen e) {lempar baru unsportedOperationException (); } /** * {@inHeritDoc} * * <p> Implementasi ini selalu melempar * {@code UnsupportedOperationException}. * * @Throws UnsupportedOperationException {@inHeritDoc} * @throws IndexOutOfBoundSException {@inHeritDoc} */ public e Ramping (indeks int) {lempar baru unsupportedOperPerationException (); }}Justru karena arraylist kelas dalam dari java.util.
Demikian pula, saat memanggil metode hapus, atau memanggil metode lain yang terkait dengan metode ADD dan hapus (seperti Addall), Anda juga akan menemukan pengecualian ExportedOperationException yang tidak didukung.
Contoh Addall:
/***@author wangmengjun**/kelas publik arrayexample {public static void main (string [] args) {/** Gunakan parameter panjang variabel*/daftar <string> array1 = arrays.aslist ("selamat datang", "untuk", "java", "dunia"); array1.addall (arrays.aslist ("aaa", "bbb")); }}Pengecualian di Thread "Main" Java.lang.unsupportedOperationException di java.util.abstractlist.add (sumber yang tidak diketahui) di java.util.abstractlist.add (sumber yang tidak diketahui) di java.util.abstractcollection.addall (sumber yang tidak diketahui) di uji.raymels.raymample.raymample.raykamplect
Contoh Set:
/***@author wangmengjun**/kelas publik arrayexample {public static void main (string [] args) {/** Gunakan parameter panjang variabel*/daftar <string> array1 = arrays.aslist ("selamat datang", "untuk", "java", "dunia"); System.out.println (array1); // ganti java dengan hello array1.set (2, "hello"); System.out.println (array1); }}Justru karena arraylist kelas internal Arrays merekrut ulang metode yang ditetapkan, sehingga program di atas dapat berjalan secara normal dan tidak akan melempar pengecualian Exception yang tidak didukung.
Hasilnya adalah sebagai berikut:
[Selamat datang, ke, Java, dunia]
[Selamat datang, ke, halo, dunia]
Gunakan skenario
Dilihat dari contoh-contoh di atas dan analisis sederhana, kelas alat array menyediakan metode aslist, yang dapat mengubah parameter panjang variabel atau array menjadi daftar.
Namun, panjang daftar yang dihasilkan diperbaiki; Ini dapat melakukan operasi modifikasi (seperti memodifikasi elemen pada posisi tertentu); itu tidak dapat melakukan operasi yang mempengaruhi panjang (seperti Tambah, Hapus, dll.). Pengecualian Exception yang tidak didukung akan dilemparkan.
Arrays.aslist lebih cocok untuk skenario di mana sudah ada data array atau beberapa elemen, tetapi perlu untuk membangun daftar dengan cepat, yang hanya digunakan untuk operasi baca, dan tidak melakukan operasi tambahan atau hapus.
Jika Anda ingin dengan cepat mendapatkan daftar daftar yang dapat ditambahkan, dihapus, dimodifikasi dan diperiksa berdasarkan data array yang diketahui, metode yang relatif sederhana adalah sebagai berikut:
Gunakan kembali java.util.arraylist untuk membungkus lapisan.
/***@author wangmengjun**/kelas publik arrayexample {public static void main (string [] args) {/** Gunakan parameter panjang variabel*/daftar <string> array1 = arraylist baru <> (arrays.aslist ("welcome", "to", "java", "world"); System.out.println (array1); array1.add ("keren ~~~"); System.out.println (array1); }}Hasilnya adalah sebagai berikut:
[Selamat datang, ke, Java, dunia]
[Selamat datang, ke, java, dunia, keren ~~~]
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!