分析ArrayList中的trimToSize()方法與應用

最近在學習java8的新特性,在學習List集合方法的時候,看到了ArrayList類中的源碼有個trimToSize方法,比較有興趣好奇就深入源代碼看來一把,比較需要注意的是,這個trimToSize方法是ArrayList類中自己的實現方法,

 

實例演示:


public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>(10);

    for (int i=0; i< 10; i++){

        list.add(i);

    }

    list.add(1);

    list.trimToSize();

    System.out.println(list);

}

這裏需要注意的是前面也已經說過了,這個ArrayList<Integer> list不能定義爲List<Integer> list

 

上面的例子new了一個初始化容器爲10的ArrayList,之後向裏面添加一個新的元素list.add(1),我們debug看看先後之間的內容對比

                        添加前

                        添加後

非常明顯直觀的是 elementData動態數組擴展容量爲15,我們直接去看看ArrayList源碼:

private void grow(int minCapacity) {

    // overflow-conscious code

    int oldCapacity = elementData.length;

    int newCapacity = oldCapacity + (oldCapacity >> 1);

    if (newCapacity - minCapacity < 0)

        newCapacity = minCapacity;

    if (newCapacity - MAX_ARRAY_SIZE > 0)

        newCapacity = hugeCapacity(minCapacity);

    // minCapacity is usually close to size, so this is a win:

    elementData = Arrays.copyOf(elementData, newCapacity);

}

oldCapacity = 10, 1010(10)右移一位位0101(5),newCapacity = 10 + 5 = 15;

之後調用trimToSize()方法, 此時elementData的大小變爲了11。也就是說這個方法將elementData的數組設置爲ArrayList實際的容量,動態增長的多餘容量被刪除了

public void trimToSize() {

    modCount++;

    if (size < elementData.length) {

        elementData = (size == 0)

        ? EMPTY_ELEMENTDATA

        : Arrays.copyOf(elementData, size);

    }

}

小總結:

    綜合上面的例子比較我們可以很顯然的看到trimToSize()方法,其實就是爲了節省掉多餘的內存空間而設計的,就相當於自己手動調用GC進行回收一部分的內存空間。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章