Daftar Array
Implementasi yang mendasarinya adalah array, yang memiliki efisiensi tinggi dalam mengakses elemen (kueri cepat, penyisipan lambat, modifikasi, dan penghapusan elemen)
Dibandingkan dengan LinkedList, itu efisien, tetapi aman-aman.
Arraylist Array adalah array yang dapat berubah yang dapat mengakses semua elemen termasuk null
Implementasi yang mendasarinya dilakukan dengan menggunakan array
objek transien [] elementData;
Metode konstruksi
private static final int default_capacity = 10; objek akhir statis privat [] kosong_elementData = {}; objek akhir statis privat [] defaultCapacity_empty_elementData = {}; objek transien [] elementData; ukuran int private; // Bangun daftar kosong arraylist publik () {this.elementData = defaultcapacity_empty_elementData; } // Buat daftar kosong dari arraylist publik kapasitas awal yang ditentukan (int initialcapacity) {if (initialcapacity> 0) {this.elementData = objek baru [initialcapacity]; } else if (initialcapacity == 0) {this.elementData = empleme_elementData; } else {lempar new ilegalArgumentException ("Kapasitas ilegal:"+ InitialCapacity); }} // Bangun daftar elemen pengumpulan yang ditentukan, yang diatur dalam urutan pengembalian iteratif dari elemen koneksi arraylist publik (koleksi <? Extends e> c) {elementData = c.toArray (); if ((size = elementData.length)! = 0) {// c.toarray mungkin (salah) tidak mengembalikan objek [] (lihat 6260652) if (elementData.getClass ()! = Object []. Class) elementData = arrays.copyof (elementData, size, size, class). } else {// ganti dengan array kosong. this.elementData = empleme_elementdata; }}penyimpanan
// Elemen pada posisi yang ditentukan dari daftar diganti dengan elemen, dan elemen asli pada posisi itu dikembalikan public e set (indeks int, elemen e) {rangeCheck (index); // Periksa kapasitas dan lemparan array: indexOutofboundsException e oldValue = elementData (index); elementData [index] = elemen; Kembalikan OldValue; } // Tambahkan elemen yang ditentukan di akhir daftar public boolean add (e e) {ensureCapacityinternal (ukuran + 1); // Array Expansion ElementData [size ++] = e; Kembali Benar; } // Add the element at the specified position of the list public boolean add(E e) { ensureCapacityInternal(size++] = e; return true; } // Add the element at the specified position of the list public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! // src: Source array, SRCPRO: Posisi Mulai dalam Array Sumber // DEST: Array Tujuan, DestPost: Posisi Mulai dari Array Target, Panjang: Jumlah Elemen Array yang Akan Disalin // Pindahkan Elemen saat ini pada posisi ini dan semua elemen berikutnya. Tambahkan elemen dalam koneksi di akhir daftar, dan elemen -elemen tersebut dalam urutan yang dikembalikan oleh koneksi ITERATOR Boolean Addall (Koleksi <? Extends E> C) {Object [] A = C.ToArray (); 0, Ukuran, NumNew); Ensurecapacityinternal (ukuran + numnew);Membaca
// Hapus elemen pada posisi yang ditentukan dari daftar ini publik e hapus (indeks int) {rangecheck (index); modcount ++; E oldValue = elementData (indeks); int nummoved = ukuran - indeks - 1; if (nummoved> 0) system.arraycopy (elementData, index+1, elementData, index, nummoved); elementData [-size] = null; // Bersihkan untuk membiarkan GC melakukan pekerjaannya kembali oldValue; } // Hapus elemen dalam daftar ini public boolean hapus (objek o) {if (o == null) {for (int index = 0; index <size; index ++) if (elementData [index] == 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 (int index) {modcount ++; int nummoved = ukuran - indeks - 1; if (nummoved> 0) system.arraycopy (elementData, index+1, elementData, index, nummoved); elementData [-size] = null; // Bersihkan untuk membiarkan GC melakukan pekerjaannya}Ekspansi array
Setiap kali elemen ditambahkan ke array, perlu untuk memeriksa apakah jumlah elemen melebihi panjang array saat ini setelah menambahkan elemen. Jika melebihi panjangnya, array akan diperluas untuk memenuhi kebutuhan menambahkan data.
public void EnsureCapacity (int mincapacity) {int minexpand = (elementData! = defaultCapacity_empty_elementData)? 0: default_capacity; if (Minsapacity> MINEXPAND) {EnsureExPlicitCapacity (MINCAPAICTY); }} private void ensureCapacityInternal (int minCapacity) {if (elementData == defaultcapacity_empty_elementData) {minsapacity = math.max (default_capacity, minsapacity); } ensureExplicitCapacity (MinCapacity); } private void ensureExplicitCapacity (int minCapacity) {modcount ++; // overflow -consent code if (MinCapacity - elementData.length> 0) Grow (MinCapacity); } private void grow (int mincapacity) {// overflow-konsisten kode int oldcapacity = elementData.length; int newcapacity = oldcapacity + (oldcapacity >> 1); if (newcapacity - mincapacity <0) newcapacity = mincapacity; if (newcapacity - max_array_size> 0) newcapacity = hugeCapacity (mintcapacity); // MinCapacity biasanya mendekati ukuran, jadi ini adalah win: elementData = arrays.copyof (elementData, newcapacity); } private static int hugeCapacity (int cincapacity) {if (mincapacity <0) // overflow lempar outofmemoryError baru (); return (Mincapacity> max_array_size)? Integer.max_value: max_array_size; }Daftar array tulisan tangan
Kelas Publik MyArrayList /*mengimplementasikan Daftar <E>* /{Private Transient Object [] ElementData; ukuran int pribadi; // Jumlah elemen publik myArraylist () {this (10); } public myArrayList (int initialcapacity) {if (initialcapacity <0) {coba {lempar pengecualian baru (); } catch (Exception e) {E.PrintStackTrace (); }} elementData = objek baru [initialcapacity]; } public int size () {ukuran pengembalian; } public boolean isEmpty () {return size == 0; } // Hapus objek sesuai dengan indeks public void Remove (int index) melempar Exception {rangeCheck (index); int nummoved = size-index-1; if (nummoved> 0) {System.ArrayCopy (ElementData, Index+1, ElementData, Index, NumMoved); } elementData [-size] = null; } // hapus objek public boolean hapus (objek obj) melempar pengecualian {for (int i = 0; i <size; i ++) {if (get (i) .equals (obj)) {rampa (i); } return true; } return true; } // Ubah set objek publik elemen (indeks int, objek obj) melempar pengecualian {rangeCheck (index); Objek oldvalue = elementData [indeks]; elementData [indeks] = obj; Kembalikan OldValue; } // Masukkan elemen pada posisi yang ditentukan public void add (indeks int, objek obj) melempar pengecualian {rangeCheck (index); EnsureCapacity (); System.ArrayCopy (ElementData, Indeks, ElementData, Indeks+1, ukuran-indeks); elementData [indeks] = obj; ukuran ++; } public void add (objek objek) {ensureCapacity (); /*elementData [size] = objek; size ++;*/ elementData [size ++] = objek; // Tetapkan nilai terlebih dahulu, lalu tingkatkan diri Anda} objek publik Get (int index) melempar Exception {rangeCheck (index); return elementData [indeks]; } public void rangecheck (int index) melempar Exception {if (index <0 || index> = size) {throw new exception (); }} // Perluas public void EnsureCapacity () {// Ekspansi array dan salinan konten jika (size == elementData.length) {// elementData = objek baru [ukuran*2+1]; Tulis dengan cara ini konten dalam array asli adalah objek hilang [] newArray = objek baru [ukuran*2+1]; // Salin konten di array/*untuk (int i = 0; i <newarray.length; i ++) {newArray [i] = elementData [i]; }*/ System.ArrayCopy (ElementData, 0, NewArray, 0, ElementData.Length); elementData = newarray; }} // uji public static void main (string [] args) {myArrayList myArrayList = myArraylist baru (3); myarraylist.add ("111"); myarraylist.add ("222"); myarraylist.add ("333"); myarraylist.add ("444"); myarraylist.add ("555"); coba {myarraylist.remove (2); myarraylist.add (3, "nilai baru"); myarraylist.set (1, "ubah"); } catch (Exception E1) {// TODO Auto-Guerated Catch Block E1.PrintStackTrace (); } System.out.println (myArrayList.size ()); untuk (int i = 0; i <myarraylist.size (); i ++) {coba {System.out.println (myArrayList.get (i)); } catch (Exception e) {E.PrintStackTrace (); }}}}