首頁常見問題正文

Arraylist擴(kuò)容機(jī)制原理是什么?

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

IT培訓(xùn)班

  ArrayList是Java中的一個(gè)動(dòng)態(tài)數(shù)組,它能夠自動(dòng)進(jìn)行擴(kuò)容以容納更多的元素。ArrayList的擴(kuò)容機(jī)制基于以下原理:

  1.初始容量

  當(dāng)創(chuàng)建一個(gè)ArrayList對(duì)象時(shí),它會(huì)分配一定的初始容量,通常為10。這是為了節(jié)省內(nèi)存,因?yàn)椴⒉皇撬械腁rrayList都需要大量的空間。

  2.容量增長(zhǎng)

  當(dāng)ArrayList中的元素?cái)?shù)量達(dá)到當(dāng)前容量時(shí),ArrayList會(huì)自動(dòng)增加其容量。在Java中,它以當(dāng)前容量的一定增量進(jìn)行擴(kuò)容,默認(rèn)情況下增量為當(dāng)前容量的一半。

  3.擴(kuò)容操作

  當(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)操作。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!