前幾天看了Java ArrayList,沒有明白trimToSize()這個方法是什么意思,所以看了一下源碼並且debug一下自己的一個例子,明白了其中的含義。貼在這里。
ArrayList al = new ArrayList(10); for(int i=0;i<10;i++){ al.add(i); } al.add(1); al.trimToSize();
例子很簡單,就是new一個初始容量為10的ArrayList,之后向里面加入一個元素。接下來看看debug的內容:
可以看到,向ArrayList里面加入10個元素之后,elementData的內容如圖所示。
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); }
olaCapacity = 10,1010(10)右移一位位0101(5),newCapacity = 10 + 5 = 15;
之后調用trimToSize()方法,再看看debug內容:
此時elementData的大小變為了11。也就是說這個方法將elementData的數組設置為ArrayList實際的容量,動態增長的多余容量被刪除了。
再貼個trimToSize()方法的源碼:用Arrays.copyOf(T [],int newLength)這個方法來截取elementData數組。
public void trimToSize() { modCount++; if (size < elementData.length) { elementData = Arrays.copyOf(elementData, size); } }