分析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进行回收一部分的内存空间。

 

 

 

 

 

 

 

 

 

 

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