使用ArrayList时设置初始容量的重要性

简介: ArrayList是Java中比较常用的一个类,它是基于数组实现,非线程安全,可快速随机访问List中的元素。ArrayList具有动态扩容的机制,每次在添加元素时,都会判断容量是否够用,如果不够用,则需要扩容。

ArrayList是Java中比较常用的一个类,它是基于数组实现,非线程安全,可快速随机访问List中的元素。

ArrayList具有动态扩容的机制,每次在添加元素时,都会判断容量是否够用,如果不够用,则需要扩容。

JDK1.8中,ArrayList的初始容量为0,第一次添加元素时,会将容量设置为10,如果容量不够,则每次会扩大50%

扩容代码如下:

    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    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);
    }

其中:

int newCapacity = oldCapacity + (oldCapacity >> 1);

容量被扩充为原容量的1.5倍,oldCapacity>>1,右移一位,即:oldCapacity除以2

elementData = Arrays.copyOf(elementData, newCapacity);

用Arrays的copyOf方法拷贝原数组内容,并设置新的长度。

可以看到ArrayList扩容需要做一次数组拷贝,如果是反复扩容,肯定会对程序的运行效率产生影响。所以在初始化ArrayList的时候,尽量设置初始化容量,避免其扩容。

测试代码:

        final int count = 20 * 100000;
        List<Integer> list = new ArrayList<>();
        long begin = System.currentTimeMillis();
        for(int i = 0; i < count ; i++) {
            list.add(i);
        }
        System.out.println("没有设置ArrayList初始容量: " + (System.currentTimeMillis() - begin) + " ms");
        
        list = new ArrayList<>(count);
        begin = System.currentTimeMillis();
        for(int i = 0; i < count ; i++) {
            list.add(i);
        }
        System.out.println("设置了ArrayList初始容量: " + (System.currentTimeMillis() - begin) + " ms");

执行结果:

没有设置ArrayList初始容量: 89 ms

设置了ArrayList初始容量: 18 ms

相关文章
|
11月前
|
人工智能 IDE 开发工具
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
1659 1
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
|
机器学习/深度学习 人工智能 自动驾驶
企业内训|AI大模型在汽车行业的前沿应用研修-某汽车集团
本课程是TsingtaoAI为某汽车集团高级项目经理设计研发,课程全面系统地解析AI的发展历程、技术基础及其在汽车行业的深度应用。通过深入浅出的理论讲解、丰富的行业案例分析以及实战项目训练,学员将全面掌握机器学习、深度学习、NLP与CV等核心技术,了解自动驾驶、智能制造、车联网与智能营销等关键应用场景,洞悉AI技术对企业战略布局的深远影响。
1260 97
|
存储 开发框架 小程序
【全栈小程序开发路线】手把手教你入门小程序开发,小白必看!
以下内容是结合我项目中实战经验,踩坑记录,大量时间学习小程序的积累,总结分享给大家。 学习路线包括前端基础、小程序开发框架、UI组件库、云开发、周边生态以及插件这几个纬度,学完这些,你也能全栈开发一个属于自己的产品。
1447 0
|
开发工具 git
git 出现502错误后用depth一步一步来
公司有个项目的git仓库,因为一些二进制文件也放在里面,版本迭代后,整个仓库特别大,有好几G。 直接git clone是不行的,会报这样的错误: error: RPC failed; HTTP 502 curl 2...
3641 0
|
弹性计算 Linux 网络安全
阿里云ECS云服务器如何开放8080端口?
阿里云服务器ECS处于安全考虑默认自带安全组(仅开放了22号和3389号端口),Tomcat的默认端口号为8080,所以想使用Tomcat不开放8080端口是不行的。很多用户通过修改iptables来开放8080号端口,结果失败,这是由于安全组,对安全组,阿里云亘古不变的安全组开放端口问题。
58349 1
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
997 2
|
JavaScript 小程序 Oracle
Sharding JDBC 实战:分布式事务处理
Sharding JDBC 实战:分布式事务处理
|
存储
【计算机系统】CPU指令执行流程与指令流水线原理
【计算机系统】CPU指令执行流程与指令流水线原理
3762 0
【计算机系统】CPU指令执行流程与指令流水线原理
|
存储 JavaScript 安全
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞(中)
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞
470 0
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞(中)
on the fly 到底几个意思
几乎每篇文档都给你来一个on the fly。知乎搜了几次也没记住,干脆把维基百科的解释翻译了一下: On the fly is a phrase used to describe something that is being changed while the process that the change affects is ongoing. On the fly 是一个短语用于表示一种现象:当进程正在运行时这个改变就生效了。
3358 0

热门文章

最新文章