Artikel ini terutama mempelajari konten terkait contoh masalah ekspansi java arraylist, sebagai berikut.
Pertama-tama, kita perlu tahu bahwa esensi arraylist sebenarnya adalah array tipe objek. Masalah ekspansi ArrayList sebenarnya adalah masalah ekspansi dari array tipe objek ini.
objek transien [] elementData;
Ada tiga situasi untuk membuat daftar array
Arraylist al = new arraylist ();
Setelah pembuatan selesai, kapasitas AL adalah 0. Anda dapat mengetahui dari kode berikut.
objek transien [] elementData; Private Static Final Object [] defaultCapacity_empty_elementData = {}; public arrayList () {this.elementData = defaultcapacity_empty_elementdata;}ArrayList al = new ArrayList (5);
Membuat objek ArrayList dengan kapasitas 5 sebenarnya adalah array objek dengan panjang 5. Anda dapat mengetahui dari kode berikut.
objek transien [] elementData; Private Static Final Object [] defaultCapacity_empty_elementData = {}; public arrayList (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); }}Arraylist al = new ArrayList <Integer> (arrays.aslist (1, 2, 3, 4, 5));
Objek ArrayList dibuat di atas dan diinisialisasi menggunakan daftar sebagai [1,2,3,4,5]. Bahkan, ia menciptakan array objek dengan panjang 5, dan isi array adalah [1, 2, 3, 4, 5]. Anda dapat mengetahui dari kode berikut.
ukuran int private; objek transien [] elementData; Private Static Final Object [] defaultCapacity_empty_elementData = {}; Public ArrayList (Collection <? 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; }} ArrayList <Integer> collection = ArrayList baru <Integer> (arrays.aslist (1, 2, 3, 4, 5)); integer [] lebih banyak inti = {6, 7, 8, 9, 10}; collection.addall (arrays.aslist (lebih banyak)); 1. Buat daftar array dengan ukuran 5, dengan konten [1, 2, 3, 4, 5]. - Kapasitas awal adalah 5
2. Tambahkan Set {6, 7, 8, 9, 10} ke objek ArrayList ini. ---- Pada saat ini, kapasitas objek Daftar Array ini perlu diperluas.
Public Boolean Addall (koleksi <? Extends e> c) {// Dapatkan objek array insert [] a = c.toArray (); // Dapatkan Panjang Konten Sisipkan int numNew = A.Length; EnsureCapacityinternal (ukuran + numNew); // Meningkatkan ModCountsyStem.arraycopy (A, 0, ElemeData); 0;}private void ensureCapacityInternal(int minCapacity) {//If the content in ArrayList is empty if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}private void ensureExplicitCapacity(int minCapacity) {modCount++;// Further calculate the expanded size minCapacityif (minCapacity - elementData.length > 0) grow(minCapacity);}private void grow(int minCapacity) {// The original size of ArrayList int oldCapacity = elementData.length;// Calculate the expanded size based on the original size, and the expanded size is 1.5 times the size of the element int newcapacity = oldcapacity + (oldcapacity >> 1); // bandingkan dengan panjang ekspansi yang sebelumnya dihitung mincapacity, ambil yang lebih besar sebagai panjang ekspansi jika (newcapacity - mincapacity <0) newcapacity = maxapacity - maxerpicity> jika panjang ekspansi> newray lebih besar dari maksimal jika (newsapacity - maxcacity - maxcity - maxcity 0) baru lebih besar dari maksimal jika (newsapacity - maxcacity - maxcity - maxcity 0) lebih besar dari maksimal jika maksimal -maxicity - maxcacity - maxcacity - maxcity - newcapacity - maxcacity - 0rayse. HugeCapacity (MinCapacity); // Ekspansi elementData = arrays.copyof (elementData, newcapacity);} private static int hugeCapacity (int mincapacity) {// MinCapacity kurang dari 0, menunjukkan overflow, jika tidak, integer maksimum yang berlebihan digunakan sebagai panjang ekspansi Final IF (Mincapacity. OutofmemoryError (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size;} 1. Ukuran asli arraylist + ukuran koleksi yang akan dimasukkan numnew = Dapatkan panjang minimum dari mincapacity arraylist yang diperluas
2. Jika ukuran asli ArrayList adalah 0, yaitu, arraylist kosong, panjang minimum arraylist setelah ekspansi cincangcity = math.max (10, mincapacity), yaitu, panjang minimum ekspansi cincangitas bukan hanya ukuran panjang asli ditambah panjang numnew yang disetel penyisipan.
3. Kecil panjang minimum yang diperluas yang diperoleh di atas bukanlah panjang yang diperluas akhir, dan perhitungan lebih lanjut diperlukan.
(1) Dapatkan ukuran asli ArrayList Oldcapacity
(2) dapatkan ukuran baru yang diperluas: newcapacity = oldcapacity*1.5;
(3) Bandingkan dengan panjang minimum yang diperluas Mincapacity yang dihitung di atas dengan ukuran baru yang diperluas yang diperoleh di sini, dan ambil yang lebih besar sebagai ukuran akhir yang diperluas.
Di atas adalah semua penjelasan terperinci dari contoh masalah ekspansi arraylist dalam artikel ini, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!