Kelas System.Collections.ArrayList adalah array khusus. Dengan menambahkan dan menghapus elemen, panjang array dapat diubah secara dinamis.
satu. keuntungan
1. Mendukung fungsi perubahan ukuran otomatis
2. Penyisipan elemen yang fleksibel
3. Penghapusan elemen yang fleksibel
dua. keterbatasan
Dibandingkan dengan array biasa, kecepatannya sedikit lebih buruk
tiga. Tambahkan elemen
1. PublicVirtualIntadd (ObjectValue);
Tambahkan Objek ke akhir ArrayList
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e");Kontennya
abcde
2. PublicVirtualVoidInsert (IntIndex, ObjectValue);
Masukkan elemen ke dalam indeks arraylist yang ditentukan
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.insert (0, "aa");Hasilnya adalah
AAABCDE
3. PublicVirtualVoidInserTrange (Intindex, IcollectionC);
Masukkan elemen dalam koleksi ke dalam indeks arraylist yang ditentukan
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); arraylist list2 = " newarraylist (); list2.add ("tt"); list2.add ("ttt"); alist.insertrange (2, list2);Hasilnya adalah
ABTTTTTCDE
Empat. menghapus
1. PublicVirtualVoidRemove (ObjectObj);
Hapus pertandingan pertama dari objek tertentu dari daftar array, perhatikan bahwa itu adalah yang pertama
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.remove ("a");Hasilnya adalah
BCDE
2. PublicVirtualVoidRemoveat (IntIndex);
Menghapus elemen pada indeks arraylist yang ditentukan
alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.removeat (0);Hasilnya adalah
BCDE
3. PublicVirtualVoidRemOverange (Intindex, Intcount);
Menghapus berbagai elemen dari daftar array. Indeks mewakili indeks, jumlah mewakili angka yang dimulai dari indeks
alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.removerange (1,3);Hasilnya adalah
Salin kode sebagai berikut: AE
4. PublicVirtualVoidClear ();
Hapus semua elemen dari ArrayList.
lima. Menyortir
1.PublicVirtualVoidSort ();
Urutkan elemen dalam daftar array atau sebagian darinya.
Arraylistalist = newarraylist (); alist.add ("e"); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); dropdownlist1.dataSource = alist; // dropdownlistdristdropdown1; dataSource = alist; // dropdownlistdristdropdown1; dataSource = alist; // dropdownlistdristdropdown1; dataSource = alist; // dropdownlistdristDropdown1; datAsource = alist;//dropdownlistdristdropdown1; datAsource = alist;//drownlistdristdrist1; dropdown1; datasource = alist; // dropdownlistDropdown1; dropdownlist1.Hasilnya adalah
EABCD
Arraylistalist = newarraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.sort (); // sortir Dropdownlist1.datasource = alist; // dropDownListDropDownList1; dropDownList1.databind ();Hasilnya adalah
abcde
2.PublicVirtualVoidReverse ();
Membalikkan urutan elemen dalam daftar array atau bagian darinya.
Arraylistalist = newarraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); alist.reverse (); // terbalik Dropdownlist1.datasource = alist; // dropDownListDropDownList1; dropDownList1.databind ();Hasilnya adalah
edcba
enam. Menemukan
1.PublicVirtualIndexof (objek);
2.PublicVirtualIndexof (objek, int);
3.PublicVirtualIndexof (objek, int, int);
Mengembalikan indeks berbasis nol dari pertandingan pertama dari daftar array atau bagiannya. Tidak ada pengembalian -1 ditemukan.
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("c"); alist.add ("d"); alist.add ("e"); intnindex = alist.indexof ("a"); // 1 nindex = alist.indexof ("p"); // tidak ditemukan, -1 4.PublicVirtualIntLastIndexof (objek);
5.PublicVirtualIntLastIndexof (objek, int);
6.PublicVirtualIntLastIndexof (objek, int, int);
Mengembalikan indeks berbasis nol dari pertandingan terakhir dari arraylist atau bagiannya.
ArrayList alist = new arraylist (); alist.add ("a"); alist.add ("b"); alist.add ("a"); // sama dengan 0 alist.add ("d"); alist.add ("e"); intnindex = alist.lastIndexof ("a"); // nilainya 2 bukan 0 7.PublicVirtualBoolContains (ObjectItem);
Menentukan apakah suatu elemen ada dalam daftar array. Kembalikan true jika dimasukkan, jika tidak kembali salah
tujuh. lainnya
1. PublicVirtualIncapacity {get; set;}
Mendapat atau mengatur jumlah elemen yang dapat dikandung oleh arraylist.
2. PublicVirtualIncount {get;}
Mendapat jumlah elemen yang sebenarnya terkandung dalam daftar array.
Kapasitas adalah jumlah elemen yang dapat disimpan oleh arraylist. Hitungan adalah jumlah elemen yang sebenarnya terkandung dalam daftar array. Kapasitas selalu lebih besar dari atau sama dengan hitungan. Jika jumlah melebihi kapasitas saat menambahkan elemen, kapasitas daftar digandakan dengan secara otomatis merealisasikan array internal.
Jika nilai kapasitas ditetapkan secara eksplisit, array internal juga perlu dipindahkan untuk mengakomodasi kapasitas yang ditentukan. Jika kapasitas secara eksplisit diatur ke 0, runtime bahasa umum menetapkannya ke kapasitas defaultnya. Kapasitas default adalah 16.
Setelah menelepon dengan jelas, hitungan adalah 0, dan saat ini pemotongan kapasitas adalah kapasitas default 16, bukan 0
3. PublicVirtualVoidtrimtosize ();
Tetapkan kapasitas ke jumlah aktual elemen dalam daftar array.
Jika Anda tidak menambahkan elemen baru ke daftar, metode ini dapat digunakan untuk meminimalkan overhead sistem memori dari daftar.
Untuk sepenuhnya menghapus semua elemen dalam daftar, hubungi metode yang jelas sebelum memanggil trimtosize. Memotong daftar array kosong akan menetapkan kapasitas arraylist ke kapasitas default, bukan nol.
ArrayList aList = new ArrayList();aList.Add("a");aList.Add("b");aList.Add("c");aList.Add("d");aList.Add("e");//Count=5,Capacity=16,aList.TrimToSize();//Count=Capacity=5; 8. Analisis Kode Sumber
Kelas implementasi antarmuka daftar, secara internal menggunakan array untuk menyimpan nilai elemen, yang setara dengan array ukuran variabel.
1. Tanda Tangan
ArrayList kelas publik <E> memperluas Daftar Abstrak <E> mengimplementasikan Daftar <E>, acak, kloning, dapat serializable, serializable
Anda dapat melihat bahwa ArrayList mewarisi kelas abstrak abstrak, yang mengimplementasikan sebagian besar metode antarmuka daftar. Jika Anda ingin mengimplementasikan daftar yang tidak dapat diubah, cukup mewarisi kelas ini dan mengimplementasikan metode GET (int) dan ukuran. Jika Anda ingin menerapkan daftar yang dapat berubah, Anda perlu mengganti set (int, e). Selain itu, jika ukuran daftar adalah variabel, metode add (int, e) dan lepas () juga harus ditimpa.
2. Konstruktor
ArrayList menyediakan tiga konstruktor:
ArrayList () ArrayList (Collection <? Extends E> C) ArrayList (int InitialCapacity)
Konvensi antarmuka koleksi bahwa setiap kelas pengumpulan harus menyediakan dua konstruktor "standar", satu adalah konstruktor tanpa parameter (yang pertama di atas), dan yang lainnya adalah konstruktor dengan parameter tunggal (yang kedua di atas). ArrayList juga menyediakan konstruktor ketiga yang menerima nilai int untuk mengatur ukuran awal arrayli (ukuran default adalah 10).
3. Metode Terkait
trimtosizepublic void trimtosize () {modcount ++; int oldcapacity = elementData.length; if (size <oldcapacity) {elementData = arrays.copyof (elementData, size); }}Digunakan untuk mengurangi kapasitas arraylist ke ukuran aktual saat ini dan mengurangi kapasitas penyimpanan. Variabel MODCount diwarisi dari AbstractList, merekam berapa kali daftar ini dimodifikasi secara struktural. Elemen arraylist sebenarnya disimpan di ElementData, yang dinyatakan sebagai: objek transien pribadi [] elementData; Ukuran variabel adalah jumlah elemen arraylist. Saat ukuran <Oldcapacity, hubungi array. Metode Copyof untuk mencapai pengurangan.
4.Indexof dan LasIndexOf
indeks int int (objek o) {if (o == null) {for (int i = 0; i <size; i ++) if (elementData [i] == null) return i; } else {for (int i = 0; i <size; i ++) if (o.equals (elementData [i])) return i; } return -1; }Kedua metode ini mengembalikan subskrip elemen yang ditentukan, dan kami ingin membedakan apakah parameternya nol. LastIndexof mirip dengan IndexOf, tetapi mencari dari belakang ke depan.
5. Perjelas Kapasitas
public void EnsureCapacity (int mincapacity) {if (Mincapacity> 0) EnsureCapacityInternal (MinCapacity); } private void ensureCapacityInternal (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); }Metode ini memastikan ukuran arraylist
6. Add dan Addall
public void add (int index, e elemen) {rangeCheckForAdd (index); Ensurecapacityinternal (ukuran + 1); // Menambah ModCount !! System.ArrayCopy (ElementData, Indeks, ElementData, Indeks + 1, Ukuran - Indeks); elementData [index] = elemen; ukuran ++; } Tambah (indeks int, elemen E) untuk menambahkan elemen ke posisi yang ditentukan. Pertama, hubungi rangecheckforadd untuk memeriksa apakah indeks itu valid. Jika indeks> ukuran || Indeks <0, pengecualian akan dilemparkan. Kemudian pastikan kapasitasnya meningkat sebesar 1, dan Sistem Panggilan. Akhirnya, atur nilai pada indeks ke elemen yang ditambahkan. Ada juga metode add (e) yang kelebihan beban yang secara langsung menambahkan elemen ke ujungnya.
Addall (koleksi <? Extends e> c) dan addall (int index, collection <? Extends e> c) Tambahkan semua elemen dalam koleksi ke akhir dan posisi yang ditentukan masing -masing.
7.Remove dan hapus
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; }Metode hapus (objek o) menghapus elemen yang ditentukan. Pertama, cari lokasi elemen, lalu hubungi Fastremove (indeks) untuk menghapusnya. Kodenya adalah sebagai berikut:
private void fastremove (int index) {modcount ++; int nummoved = ukuran - indeks - 1; if (nummoved> 0) // pindahkan semua elemen di belakang indeks+1 satu posisi sistem forward.arraycopy (elementData, index+1, elementData, index, nummoved); elementData [-size] = null; // Biarkan GC melakukan pekerjaannya} Metode Hapus (INT Index) yang kelebihan beban digunakan untuk menghapus elemen di lokasi yang ditentukan. Removerange (int fromIndex, int toindex) digunakan untuk menghapus semua elemen antara lokasi yang ditentukan.
Removeall (Collection <?> C) dan Retainall (Collection <?> C) kode adalah sebagai berikut:
Public Boolean Removeall (Collection <?> C) {Objects.requirenonnull (c); return batchremove (c, false); } public boolean retainall (collection <?> c) {objects.requirenonnull (c); return batchremove (c, true); }Mereka semua diimplementasikan dengan memanggil metode BatchRemove, dan kode mereka adalah sebagai berikut:
private boolean batchremove (koleksi <?> C, komplemen boolean) {objek akhir [] elementData = this.elementData; int r = 0, w = 0; boolean dimodifikasi = false; coba {untuk (; r <size; r ++) if (c.contains (elementData [r]) == komplemen) elementData [w ++] = elementData [r]; } akhirnya {// menjaga kompatibilitas perilaku dengan abstrakcollection, // bahkan jika c.contains () melempar. if (r! = size) {System.ArrayCopy (ElementData, R, ElementData, W, Size - R); w += ukuran - r; } if (w! = size) {// jelas untuk membiarkan GC melakukan pekerjaannya untuk (int i = w; i <size; i ++) elementData [i] = null; modcount += size - w; ukuran = w; dimodifikasi = true; }} return dimodifikasi; }Metode ini memiliki dua parameter. Yang pertama adalah koleksi operasi dan yang kedua adalah nilai boolean. Dengan mengaturnya ke benar atau salah, ia memilih apakah akan menghapus atau kembali. Pernyataan dalam mencoba menempatkan yang tersisa antara 0 dan W, dan akhirnya yang kedua jika akhirnya menangani ruang setelah W, dan yang pertama dieksekusi ketika c.contains () melempar pengecualian.