专栏首页BAT的乌托邦【小家java】关于ArrayList中的trimToSize方法的使用

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


前言

在看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绝大多数希望的还是面向接口去编程,而不是面向实现。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【小家Spring】Spring-jdbc的使用以及Spring事务管理的8种方式介绍(声明式事务+编程式事务)

    为了使JDBC更加易于使用,Spring 在 JDBC API 上定义了一个抽象层,以此建立一个 JDBC 存取框架

    YourBatman
  • 【小家java】Spring事务不生效的原因大解读

    事务在后端开发中无处不在,是数据一致性的最基本保证。在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上...

    YourBatman
  • 【小家java】Apache Commons-lang3提供的StopWatch执行时间监视器,以及Spring提供的StopWatch分析

    编码过程中我们经常会希望得到一段代码(一个方法)的执行时间,本文将介绍两种时间监视器(秒表)来让你优雅的、灵活的处理这个问题。

    YourBatman
  • .NET Remoting 体系结构 之 生命周期管理

    对于客户端,答案比较简单。只要客户端调用远程对象上的方法,就会产生一个 System.Runtime.Remoting.RemotingException 类型...

    DougWang
  • 转载:(Mac)在bash和zsh配置环境变量path的几种方法

    老习惯,列出本文参考或引用或转载的文档和博客,致以崇高的敬意,感兴趣的可以去看看 1.http://postgresapp.com/ 2.http://po...

    Zachary46
  • 在CentOS 7上使用WildFly进行Java开发

    JBoss AS(重命名为WildFly)已被使用多年,是最有名的高效和免费的Java社区应用服务器之一。当Red Hat开始为其企业版JBoss EAP的对内...

    用户1196457
  • 只会G代码不会宏,就别说你是数控师傅

    一、变量 普通加工程序直接用数值指定G代码和移动距离;例如,GO1和X100.0。使用用户宏程序时,数值可以直接指定或用变量指定。当用变量时,变量值可用程序或用...

    机器人网
  • 谷歌内战史

    当地时间上午11点10分,100名员工走出谷歌办公室。13个小时后,该公司纽约总部的电梯里挤满了人,以至于员工们要走楼梯下楼,到街上抗议。作为抗议游行的一部分,...

    新智元
  • MySQL默认隔离级别为什么是RR

    多次听到“MySQL为什么选择RR为默认隔离级别”的问题,其实这是个历史遗留问题,当前已经解决,但MySQL的各个版本沿用了原有习惯。历史版本中的问题是什么,当...

    July
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考

    <PostBuildEvent>call "$(SolutionDir)tools\tools\Magicodes.CmdTools.exe" copy -s ...

    雪雁-心莱科技

扫码关注云+社区

领取腾讯云代金券