Daftar array yang mendasarinya mempertahankan array dinamis, dan setiap contoh arraylist memiliki kapasitas. Kapasitas ini mengacu pada ukuran array yang digunakan untuk menyimpan daftar elemen. Itu selalu setidaknya sama dengan ukuran daftar. Karena elemen terus ditambahkan ke daftar array, kapasitasnya juga meningkat secara otomatis.
ArrayList tidak sinkron (yaitu, tidak aman utas). Jika beberapa utas mengakses instance ArrayList secara bersamaan, dan setidaknya satu dari utas secara struktural memodifikasi daftar, ia harus mempertahankan sinkronisasi eksternal. Dalam lingkungan multi-threaded, daftar array yang aman dapat dinyatakan menggunakan Metode Collections.SynchronizedList, misalnya:
Daftar arraylist = collections.synchronizedList (new arraylist ());
Berikut ini adalah kode sumber ArrayList untuk menganalisis prinsipnya.
1. Metode Konstruksi ArrayList: ArrayList menyediakan tiga metode konstruksi yang berbeda
1) ArrayList (), buat daftar kosong dengan kapasitas awal 10.
2) ArrayList (int InitialCapacity), membuat daftar kosong dengan kapasitas awal yang ditentukan.
3) ArrayList (Collection <? Extends E> C), membuat daftar elemen yang berisi koleksi yang ditentukan, yang diatur dalam urutan di mana iterator koleksi mengembalikannya.
Kode sumber adalah sebagai berikut:
objek transien privat [] elementData; arraylist publik (int initialcapacity) {super (); if (InitialCapacity <0) melempar IllegalArgumentException baru ("Kapasitas Ilegal:"+ InitialCapacity); this.elementData = objek baru [inisialkapacity]; // menghasilkan array jenis objek dengan panjang 10} public arraylist () {this (10); // Call ArrayList (int i)} <br> <br> Public ArrayList (Collection <? Extends e> c) {elementData = c.toArray (); // mengembalikan array yang berisi semua elemen dalam ukuran koleksi ini = elementData.length; // C.ToArray mungkin (salah) tidak mengembalikan objek [] (lihat 6260652) if (elementData.getClass ()! = Object []. class) elementData = arrays.copyof (elementData, ukuran, objek []. Kelas); // Salin array yang ditentukan dan kembalikan array jenis objek yang berisi elemen dan panjang yang sama} Saat menggunakan arraylist () untuk menghasilkan objek pengumpulan tanpa parameter, konstruktor arraylist (int initialcapacity) dipanggil di bagian bawah untuk menghasilkan array tipe objek dengan panjang 10. Saat menggunakan konstruktor dengan parameter jenis set, array jenis objek yang berisi elemen dan panjang yang sama dihasilkan di bagian bawah.
2. Tambah metode: ArrayList menyediakan dua metode tambahkan untuk menambah elemen
1) Tambahkan (e e), tambahkan elemen yang ditentukan ke akhir daftar ini.
2) Tambah (indeks int, e e), masukkan elemen yang ditentukan ke dalam posisi yang ditentukan dalam daftar ini. Bergerak ke kanan elemen saat ini dalam posisi itu (jika ada) dan semua elemen berikutnya (diindeks dengan 1) ukuran int pribadi;
public boolean add (e e) {ensurecapacity (ukuran + 1); // Perluas elemen kapasitas array [ukuran ++] = e; // Tambahkan elemen E ke array objek dengan ukuran subskrip, dan jalankan ukuran ++ return true; } public void add (indeks int, elemen e) {if (index> size || index <0) // Jika subskrip array yang ditentukan dimasukkan melebihi kapasitas array atau subskrip yang ditentukan kurang dari 0, lempar pengecualian indexOutofboundsException ("indeks:"+indeks+", ukuran:"+ukuran); Ensurecapacity (ukuran+1); // Perluas sistem kapasitas array. // Salin array dari array sumber yang ditentukan, dan salinannya dimulai dari posisi yang ditentukan ke posisi yang ditentukan dari array target. <br> // elementData --- indeks array sumber --- posisi mulai di array sumber <br> // elementData --- indeks array target+1 --- posisi mulai dalam array target <br> // ukuran-indeks --- jumlah elemen array yang akan disalin elementData [indeks] = elemen; // Letakkan elemen yang akan ditambahkan pada ukuran indeks array yang ditentukan ++; } public void EnsureCapacity (int mincapacity) {modcount ++; int oldcapacity = elementData.length; // kapasitas array asli if (mincapacity> oldcapacity) {objek oldData [] = elementData; int newcapacity = (oldcapacity * 3)/2 + 1; // Tentukan kapasitas array baru, yaitu 1,5 kali kapasitas array asli +1 if (newcapacity <mincapacity) newCapacity = mincapacity; // MinCapacity biasanya mendekati ukuran, jadi ini adalah win: elementData = arrays.copyof (elementData, newcapacity); // Salin array yang ditentukan dan kembalikan kapasitas array baru sebagai newcapacity}} Jika lebih dari 10 elemen ditambahkan dalam koleksi, lapisan bawah arraylist akan menghasilkan array baru dengan panjang 1,5 kali + 1 dari array asli, dan menyalin elemen dalam array asli ke dalam array baru, dan elemen tambahan selanjutnya akan ditempatkan di array baru. Proses ini diulangi ketika panjang array baru tidak dapat mengakomodasi elemen yang baru ditambahkan. Ini adalah prinsip implementasi menambahkan elemen ke koleksi.
3. Dapatkan metode:
1) Dapatkan (indeks int), kembalikan elemen pada posisi yang ditentukan dalam daftar ini.
Public e get (int index) {rangeCheck (index); // Periksa apakah indeks yang ditentukan dilewati adalah pengembalian hukum (e) ElementData [indeks]; // Kembalikan elemen array dengan indeks indeks subskrip array} private void rangeCheck (int index) {if (index> = size) // Jika subskrip yang masuk lebih besar dari atau sama dengan kapasitas set, lempar pengecualian indexoutofboundsException ("index:"+index+", ukuran:"+ukuran); } 4. Hapus metode:
1) e Hapus (indeks int), hapus elemen pada posisi yang ditentukan dalam daftar ini. Pindahkan semua elemen berikutnya ke kiri (penurunan indeks mereka dengan 1).
2) Boolean Hapus (Objek O), Hapus elemen yang ditentukan yang muncul untuk pertama kalinya dalam daftar ini (jika ada). Jika daftar tidak berisi elemen ini, daftar tidak akan diubah dan nilai boolean akan dikembalikan.
public e Remove (int index) {rangeCheck (index); // Periksa apakah indeks yang ditentukan adalah legal modcount ++; E oldValue = (e) elementData [indeks]; // Dapatkan elemen array dari indeks yang ditentukan int nummoved = size - index - 1; // Jumlah elemen yang akan dipindahkan jika (nummoved> 0) system.arraycopy (elementData, indeks+1, elementData, indeks, nummoved); // pindahkan elemen elemen array [-ukuran] = null; // Biarkan GC melakukan pekerjaannya mengembalikan OldValue; } public boolean hapus (objek o) {if (o == null) {// Jika parameter yang diteruskan adalah null untuk (int index = 0; index <size; index ++) if (elementData [index] == null) {// hapus kemunculan pertama null fastremove (index); Kembali Benar; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementData [index])) {fastremove (index); Kembali Benar; }} return false; } private void fastremove (index int) {// Hapus elemen pada posisi yang ditentukan, metode implementasi mirip dengan lepaskan (int i) modcount ++; int nummoved = ukuran - indeks - 1; if (nummoved> 0) system.arraycopy (elementData, index+1, elementData, index, nummoved); elementData [-size] = null; // Biarkan GC melakukan pekerjaannya} 5. Metode Klon:
1) Object Clone (), mengembalikan salinan dangkal dari contoh arraylist ini (tidak ada menyalin elemen -elemen ini sendiri).
objek publik clone () {coba {arraylist <e> v = (arraylist <E>) super.clone (); // Menghitung metode klon dari kelas objek untuk mengembalikan objek arraylist v.elementData = arrays.copyof (elementData, ukuran); // Salin array target v.modcount = 0; mengembalikan v; } catch (clonenotsupportedException e) {// Ini seharusnya tidak terjadi, karena kita dapat dikloning melempar internalError baru (); }} Analisis di atas beberapa kode sumber utama arraylist, kami tahu prinsip implementasi arraylist yang mendasarinya. Ada poin dan poin berikut untuk kode sumber ArrayList:
1) Lapisan arraylist yang mendasari diterapkan berdasarkan array, dan elemen target dapat ditemukan secara akurat melalui standar berikut, sehingga efisiensi pencarian tinggi; Namun, menambahkan atau menghapus elemen akan melibatkan pergerakan posisi sejumlah besar elemen, yang tidak efisien.
2) ArrayList menyediakan tiga metode konstruksi yang berbeda. Metode konstruksi tanpa parameter menghasilkan array jenis objek dengan panjang 10 secara default di lapisan bawah. Ketika jumlah elemen yang ditambahkan dalam set lebih besar dari 10, array akan mengembang secara otomatis, yaitu, menghasilkan array baru dan menempatkan elemen -elemen dari array asli ke dalam array baru.
3) Metode Ensurecapacity memperluas array, yang akan menghasilkan array baru dengan panjang 1,5 kali + 1 dari array asli. Karena elemen terus ditambahkan ke arraylist, ulangi proses ketika panjang array tidak dapat memenuhi kebutuhan.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.