最近在學習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進行回收一部分的內存空間。