前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小家java】关于ArrayList中的trimToSize方法的使用

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

作者头像
YourBatman
发布2019-09-03 16:36:23
8650
发布2019-09-03 16:36:23
举报
文章被收录于专栏:BAT的乌托邦BAT的乌托邦

前言

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

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

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

实例演示
代码语言:javascript
复制
    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的源码:

代码语言:javascript
复制
 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数组。

代码语言:javascript
复制
	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绝大多数希望的还是面向接口去编程,而不是面向实现。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实例演示
  • 附加说明
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档