更新時(shí)間:2023-05-24 來源:黑馬程序員 瀏覽量:
ArrayList是Java中的一個(gè)動(dòng)態(tài)數(shù)組,它能夠自動(dòng)進(jìn)行擴(kuò)容以容納更多的元素。ArrayList的擴(kuò)容機(jī)制基于以下原理:
當(dāng)創(chuàng)建一個(gè)ArrayList對(duì)象時(shí),它會(huì)分配一定的初始容量,通常為10。這是為了節(jié)省內(nèi)存,因?yàn)椴⒉皇撬械腁rrayList都需要大量的空間。
當(dāng)ArrayList中的元素?cái)?shù)量達(dá)到當(dāng)前容量時(shí),ArrayList會(huì)自動(dòng)增加其容量。在Java中,它以當(dāng)前容量的一定增量進(jìn)行擴(kuò)容,默認(rèn)情況下增量為當(dāng)前容量的一半。
當(dāng)需要擴(kuò)容時(shí),ArrayList會(huì)創(chuàng)建一個(gè)更大的內(nèi)部數(shù)組,并將所有的元素從舊數(shù)組復(fù)制到新數(shù)組中。這涉及到創(chuàng)建新數(shù)組、復(fù)制元素以及銷毀舊數(shù)組的操作。由于這些操作的開銷較大,頻繁的擴(kuò)容可能會(huì)影響性能。
下面是一個(gè)簡(jiǎn)單的代碼演示,展示了ArrayList的擴(kuò)容機(jī)制:
import java.util.ArrayList; public class ArrayListDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); // 創(chuàng)建一個(gè)ArrayList對(duì)象 for (int i = 0; i < 20; i++) { list.add(i); // 添加元素到ArrayList System.out.println("Size: " + list.size() + ", Capacity: " + getCapacity(list)); } } // 獲取ArrayList的容量(內(nèi)部使用反射) private static int getCapacity(ArrayList<?> list) { try { java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData"); field.setAccessible(true); return ((Object[]) field.get(list)).length; } catch (Exception e) { e.printStackTrace(); return -1; } } }
在上面的代碼中,我們創(chuàng)建了一個(gè)ArrayList對(duì)象,并循環(huán)向其中添加元素。在每次添加元素后,我們打印出ArrayList的當(dāng)前大小(size)和容量(capacity)。你可以運(yùn)行該代碼,觀察容量是如何增長(zhǎng)的。注意,由于ArrayList的實(shí)際容量是私有字段,我們使用了反射來獲取它。
請(qǐng)注意,ArrayList的擴(kuò)容機(jī)制是自動(dòng)的,你不需要顯式地調(diào)用擴(kuò)容方法。ArrayList會(huì)在需要時(shí)自動(dòng)進(jìn)行擴(kuò)容,并在內(nèi)部處理相關(guān)操作。