在看ArrayList源码的时候,突然看到一个方法trimToSize,比较好奇,所以自己就试验了一把,看看有什么用。
备注:因为我们平时都会多态的方式去处理List,所以我们很少关注ArrayList自己的方法,比如trimToSize方法就是一个例子。
本文主要结合一些实例,来介绍此方法的作用
public static void main(String[] args) {
ArrayList al = new ArrayList(10);
for (int i = 0; i < 10; i++) {
al.add(i);
}
al.add(1);
al.trimToSize();
System.out.println(al);
}
注意这里ArrayList al =
而不是List al =
这么写。因为这个方法不是List接口,而是实现类ArrayList自己的。
例子很简单,就是new一个初始容量为10的ArrayList,之后向里面加入一个元素。接下来看看debug
的内容:
当我们继续执行al.add(1);后,再看看
显然,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);
}
}
有小伙伴反应说他debug的时候,并没有看到elementData
长度变为15,这里我猜测一下,你用的应该是idea开发工具。这下面我给出一个idea的debug查看方法,也算小科普一下:
如图,默认情况下Idea对List类型的显示就是这样的,它过于智能
了,所以它只把用户关心的东西显示给你看了,让你的焦点放在最重要的数据上。
我们只需要做下一面一步操作,就能看到更详细得信息了:
对这个变量View as -> toString
就会看到更加详细的信息了。如下elementData
的长度确实就是15~~~
之前一直都用eclipse撸代码,现在转战idea了,爽得飞起
这个方法很显然,是为了节约内存
空间而设置的,相当于自己可以手动去回收一部分内存空间。
但是对于java对内存不敏感的语言了说,基本上没什么必要这么做。我们只需要知道可以这么做就行,但是没有必要麻烦自己。毕竟我们使用list绝大多数希望的还是面向接口去编程,而不是面向实现。
虽然这个方法没什么大作用,但是对知识的好奇心,还是学习编程很重要的一种态度。