Ikhtisar ArrayList:
ArrayList diimplementasikan berdasarkan array dan merupakan array dinamis yang kapasitasnya dapat tumbuh secara otomatis, mirip dengan memori aplikasi dinamis dalam bahasa C, yang secara dinamis meningkatkan memori.
ArrayList tidak aman-aman dan hanya dapat digunakan dalam lingkungan satu utas. Dalam lingkungan multi-threaded, Anda dapat mempertimbangkan untuk menggunakan fungsi collections.
ArrayList mengimplementasikan antarmuka serializable, sehingga mendukung serialisasi, dapat ditransmisikan melalui serialisasi, mengimplementasikan antarmuka acak Access, dan mendukung akses acak cepat. Bahkan, ini adalah akses cepat melalui nomor seri subskrip, mengimplementasikan antarmuka yang dapat dikloning, dan dapat dikloning.
Setiap contoh arraylist memiliki kapasitas, yang mengacu pada ukuran array yang digunakan untuk menyimpan elemen daftar. Itu selalu setidaknya sama dengan ukuran daftar. Karena elemen terus ditambahkan ke daftar array, kapasitasnya juga meningkat secara otomatis. Pertumbuhan otomatis akan membawa rekopi data ke array baru, jadi jika Anda dapat memprediksi jumlah data, Anda dapat menentukan kapasitasnya saat membangun daftar array. Sebelum menambahkan sejumlah besar elemen, aplikasi ini juga dapat menggunakan operasi Ensurecapacity untuk meningkatkan kapasitas instance ArrayList, yang dapat mengurangi jumlah redistribusi tambahan.
Perhatikan bahwa implementasi ini tidak sinkron. Jika beberapa utas mengakses instance ArrayList secara bersamaan, dan setidaknya satu dari utas secara struktural memodifikasi daftar, itu harus tetap disinkronkan secara eksternal.
Mari membuat catatan dan ringkasan java arraylist
ArrayList kelas publik <E> { / *** elemen yang menyimpan koleksi** / objek transien pribadi [] elementData; / ** Ukuran elemen*/ ukuran int pribadi;Tentukan kelas generik, array objek dan variabel pribadi untuk merekam jumlah elemen dalam koleksi. Ada variabel pribadi tambahan dalam teks asli, dan saya tidak tahu harus menggunakannya, dan penulis tidak memiliki penjelasan atau menyebutkannya. Tidak apa -apa jika saya tidak menggunakannya.
/ ** * Inisialisasi sesuai dengan ukuran yang ditentukan * @param initialcapacity */ public arraylist (int initialcapacity) {super (); if (initialcapacity <= 0) {// Pengecualian Lempar IllegalArgumentException baru ("Parameter inisialisasi tidak boleh kurang dari 0"); } else {// inisialisasi array this.elementData = objek baru [initialcapacity]; }} / *** Inisialisasi default* / arraylist publik () {this (10); } /*** Inisialisasi sesuai dengan kelas koleksi* @param c kelas yang harus mewarisi antarmuka koleksi* /arraylist publik (koleksi <? Extends e> c) {// inisialisasi elementData = c.toArray (); size = elementData.length; // Konversi tipe objek if (elementData.getClass ()! = Object []. }} 3 Metode Inisialisasi, inisialisasi array sesuai dengan ukuran default, inisialisasi ukuran yang diberikan dan lulus kelas yang mewarisi antarmuka pengumpulan pengumpulan untuk inisialisasi penugasan konversi
/ *** Koleksi Ekspansi* @param mincapacity*/ public void ensurecapacity (int minsapacity) {/ ** Ukuran array saat ini*/ int oldcapacity = elementData.length; if (mincapacity> oldcapacity) { /*** Meskipun OldData tidak digunakan, ini tentang manajemen memori dan metode arrays.copyof () tidak aman-utas* OldData mengacu pada variabel elementData selama siklus hidup dari IF, jadi tidak akan didaur ulang oleh GC* ketika arrays.copyOf () MODOKS LAINNYA, MOTODA,) KOPACICY, MODEK LENGAH, MODEK LENGAH, MOTOLASI LAGI DARI NEWIK, MODEY Life, Mengalokasikan memori memori memori memori dari dirambah. * Ketika akhir berangkat jika, siklus tua berakhir dan didaur ulang*/ objek oldData [] = elementData; int newcapacity = (oldcapacity * 3)/2 + 1; // Tingkatkan 50%+1 if (newcapacity <mintcapacity) newcapacity = MinCapacity; // Gunakan arrays.copyof untuk menyalin elemen koleksi dan menghasilkan array elementData = arrays.copyof, newcapacity) baru; }}Ini adalah metode inti. Perluasan set sebenarnya adalah untuk membandingkan perluasan array dan ukuran koleksi MinCapacity untuk menentukan apakah harus diperluas. Metode arrays.copyof () digunakan untuk ekspansi.
Teks asli memiliki penjelasan terperinci. Metode ini menyalin konten parameter pertama ke array baru. Ukuran array adalah parameter kedua dan mengembalikan array baru. Ada komentar terperinci tentang variabel Olddata.
/ *** Periksa apakah indeks keluar dari batas* @param index*/ private void rangecheck (int index) {if (index> size || index <0) {throw indexOutOfBoundSException ("indikator melebihi, indeks:" + index + ", size:" + size); }}Apakah pencarian subskrip adalah 1 /**
* Tambahkan elemen* Tambahkan elemen yang ditentukan ke akhir koleksi* @param e menambahkan elemen* @return*/ public boolean add (e e) {ensureCapacity (ukuran+1); elementData [ukuran] = e; ukuran ++; Kembali Benar; }Tambahkan elemen, pertama -tama perluas kapasitas, tetapkan nilai, lalu tambahkan elemen satu. Perhatikan bahwa ukuran bidang+1 tidak ditambahkan satu. Berikut adalah operasi aritmatika, jadi perlu meningkatkannya nanti.
/ *** Tambahkan elemen* Tambahkan elemen ke posisi yang ditentukan* @param indeks indeks indeks indeks elemen indeks elemen elemen* @param elemen* @return*/ public boolean add (indeks int, elemen e) {rangeCheck (index); Ensurecapacity (ukuran+1); // ElementData Element Mulai dari posisi indeks dan panjang ukuran-indeks, // Salin ke array ElementData baru mulai dari posisi indeks sebagai indeks+1. // Ini berarti bahwa elemen saat ini dalam posisi ini dan semua elemen selanjutnya dipindahkan tepat dengan satu posisi. System.ArrayCopy (ElementData, Indeks, ElementData, Indeks+1, ukuran-indeks); elementData [index] = elemen; size ++; // tambahkan elemen satu return true; }Perbedaannya di sini adalah System.ArrayCopy (ElementData, Index, ElementData, Index+1, Size-Index);
Ini adalah metode internal c. Teks asli yang terperinci memiliki penjelasan, jadi saya tidak akan membicarakannya di sini. Ini juga merupakan inti dari seluruh daftar array dan juga prinsip implementasi internal array.copyof ()
/*** Tambahkan semua elemen* Tambahkan semua elemen dalam koleksi ke akhir daftar ini dalam urutan elemen yang dikembalikan oleh iterator koleksi yang ditentukan. * @param c * @return */ public boolean addall (collection <? extends e> c) {objek [] newElement = c.toArray (); int elementLength = newElement.length; Ensurecapacity (ukuran+elementLength); // dari subskrip newElement 0, elemen elementlength, elementData ukuran subscript system.arraycopy (newElement, 0, elementData, size, elementLength); ukuran+= elementLength; return elementLength! = 0; }Pada dasarnya, metode lain hanya melakukan pemrosesan yang berbeda sesuai dengan situasi yang berbeda, seperti meneruskan objek data melalui antarmuka dan memperoleh panjang untuk ekspansi, dan menyalin data ke array baru menggunakan sistem dan arraycopy.
/ *** Tentukan posisinya, tambahkan semua elemen* @param indeks memasukkan indeks posisi* @param c dimasukkan koleksi elemen* @return*/ public boolean addall (indeks int, koleksi <? Extends e> c) {if (index> ukuran || indeks <0) {throw indextoFboundsException ("index:" + index + ", ukuran:" + ukuran: " } Objek [] newElement = c.toArray (); int elementLength = newElement.length; Ensurecapacity (ukuran+elementLength); int nummoved = ukuran-indeks; // menilai apakah posisi penyisipan berada di tengah array jika (nummoved> 0) {// pindahkan semua elemen di belakang posisi penyisipan indeks ke belakang // masukkan elemen nummoved mulai dari indeks indeks indeks indeks ke posisi indeks+elementLeng ElementData num. } // Tambahkan elementLength di NewElement dari 0 ke posisi di mana indeks elementData dimulai system.arraycopy (newElement, 0, elementData, index, elementLength); ukuran += elementLength; return elementLength! = 0; } / ** * Tentukan nilai indeks * @param index * @param elemen * @return * / public e set (indeks int, elemen e) {rangeCheck (index); E OldElement = (e) ElementData [indeks]; elementData [index] = elemen; mengembalikan OldElement; } / ** * Dapatkan nilai berdasarkan indeks * @param index * @return * / public e get (int index) {rangeCheck (index); return (e) elementData [indeks]; } / *** Hapus elemen Menurut subscript* @param index* / public e rampai (indeks int) {rangeCheck (index); E OldElement = (e) ElementData [indeks]; / ** Jumlah elemen setelah subskrip yang dihapus*/ int nummoved = size-index-1; // Jika dipindahkan dalam rentang array jika (nummoved> 0) system.arraycopy (elementData, index+1, elementData, index, nummoved); // lepaskan elementData [-size] = null; mengembalikan OldElement; } /** * Hapus sesuai dengan elemen * @param obj * @return * /public boolean hapus (objek obj) {// arraylist memungkinkan null, jadi pemrosesan penilaian juga harus dilakukan jika (obj == null) {for (int index = 0; index <size; index ++) {if (elementdata [index] == null) {index) {if (elementdata [index] == null) {index) {if (elementdata [index] == null) {index) {if (elementdata [index] == null) {index) {if if (elementdata [index] == null) {index) {if (elementdata [index] {index; index; index; index) {if (elementdata [index] {index) {if (element) Kembali Benar; }}} else {for (int index = 0; index <size; index ++) {if (obj.equals (elementData [index])) {reveat (index); Kembali Benar; }}} return false; } / *** Hapus elemen dalam kisaran yang ditentukan sesuai dengan subscript* @param fromIndex start* @param toindex end* / protected void removerange (int fromIndex, int toindex) {rangeCheck (fromIndex); Rangecheck (toindex); // Jumlah elemen yang akan dipindahkan int nummoved = size - toindex; // pindahkan elemen di belakang toindex ke fromIndex system.arraycopy (elementData, toindex, elementData, fromIndex, nummoved); // Jumlah elemen yang akan dihapus int newsize = size- (toindex-fromindex); while (size! = newsize) {elementData [-size] = null; }} / *** Sesuaikan kapasitas array dengan kapasitas aktual* / public void trimtosize () {int length = elementData.length; if (size <leng) {objek [] old = elementData; elementData = arrays.copyof (elementData, ukuran); }} / *** Konversi elemen koleksi menjadi array* @return* / objek publik [] toArray () {return arrays.copyof (elementData, size); } public <t> t [] toArray (t [] a) {if (a.length <size) {return (t []) arrays.copyof (elementData, size, a.getClass ()); } // Salin elemen koleksi ke array asystem.arraycopy (elementData, 0, a, 0, size); if (a.length> size) {for (int index = size; index <a.length; index ++) {a [index] = null; }} return a; } Pada dasarnya, ini semua tentang mengoperasikan array dan menggunakan metode C untuk menetapkan nilai dan memindahkannya. Anda dapat melihat teks asli secara detail. Tidak banyak masalah dalam teks asli kecuali untuk variabel pribadi, dan kode dapat berjalan dengan sempurna. Kesulitan ini dan penggunaan variabel oldData dalam metode ekspansi adalah dua metode sistem, arraycopy dan arrayist.copy () dan penggunaan variabel oldData dalam metode ekspansi. Variabel ini sangat bagus. Pada awalnya, saya tidak tahu mengapa saya menggunakannya seperti ini, dan saya akan menjelaskannya di akhir teks asli.
Di atas adalah contoh penjelasan dari implementasi java arraylist yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin Network!