更新時間:2023-05-24 來源:黑馬程序員 瀏覽量:

ArrayList是Java中的一個動態(tài)數(shù)組,它能夠自動進行擴容以容納更多的元素。ArrayList的擴容機制基于以下原理:
當創(chuàng)建一個ArrayList對象時,它會分配一定的初始容量,通常為10。這是為了節(jié)省內存,因為并不是所有的ArrayList都需要大量的空間。
當ArrayList中的元素數(shù)量達到當前容量時,ArrayList會自動增加其容量。在Java中,它以當前容量的一定增量進行擴容,默認情況下增量為當前容量的一半。
當需要擴容時,ArrayList會創(chuàng)建一個更大的內部數(shù)組,并將所有的元素從舊數(shù)組復制到新數(shù)組中。這涉及到創(chuàng)建新數(shù)組、復制元素以及銷毀舊數(shù)組的操作。由于這些操作的開銷較大,頻繁的擴容可能會影響性能。
  下面是一個簡單的代碼演示,展示了ArrayList的擴容機制:
import java.util.ArrayList;
public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(); // 創(chuàng)建一個ArrayList對象
        for (int i = 0; i < 20; i++) {
            list.add(i); // 添加元素到ArrayList
            System.out.println("Size: " + list.size() + ", Capacity: " + getCapacity(list));
        }
    }
    // 獲取ArrayList的容量(內部使用反射)
    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)建了一個ArrayList對象,并循環(huán)向其中添加元素。在每次添加元素后,我們打印出ArrayList的當前大小(size)和容量(capacity)。你可以運行該代碼,觀察容量是如何增長的。注意,由于ArrayList的實際容量是私有字段,我們使用了反射來獲取它。
請注意,ArrayList的擴容機制是自動的,你不需要顯式地調用擴容方法。ArrayList會在需要時自動進行擴容,并在內部處理相關操作。