最近在学习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进行回收一部分的内存空间。