【小家java】关于ArrayList中的trimToSize方法的使用

版权声明: https://blog.csdn.net/f641385712/article/details/82347045

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


前言

在看ArrayList源码的时候,突然看到一个方法trimToSize,比较好奇,所以自己就试验了一把,看看有什么用。

备注:因为我们平时都会多态的方式去处理List,所以我们很少关注ArrayList自己的方法,比如trimToSize方法就是一个例子。

本文主要结合一些实例,来介绍此方法的作用

实例演示

 ArrayList al = new ArrayList(10);
        for(int i=0;i<10;i++){
            al.add(i);
        }
        al.add(1);
        al.trimToSize();

注意这里ArrayList al = 而不是List a1 = 这么写。因为这个方法不是List接口的。

例子很简单,就是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);
        }
    }

最后

这个方法很显然,是为了节约内存空间而设置的,相当于自己可以手动去回收一部分内存空间。

但是对于java对内存不敏感的语言了说,基本上没什么必要这么做。我们只需要知道可以这么做就行,但是没有必要麻烦自己。毕竟我们使用list绝大多数希望的还是面向接口去编程,而不是面向实现。

虽然这个方法没什么大作用,但是对知识的好奇心,还是学习编程很重要的一种态度。

猜你喜欢

转载自blog.csdn.net/f641385712/article/details/82347045