博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ArrayList时设置初始容量的重要性
阅读量:6321 次
发布时间:2019-06-22

本文共 1787 字,大约阅读时间需要 5 分钟。

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
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

转载地址:http://nqaxa.baihongyu.com/

你可能感兴趣的文章
外部线程停止Java子线程的方法
查看>>
Functions of the call stack
查看>>
[Python] Working with file
查看>>
点云数据处理学习笔记
查看>>
python进行des加密解密,而且可以与JAVA进行互相加密解密
查看>>
远程视频监控之应用篇(mjpg-streamer)
查看>>
更加清楚理解mvc结构
查看>>
如何下载HLS视频到本地(m3u8)
查看>>
音频和视频
查看>>
ffmpeg && nginx hls
查看>>
关于RPG游戏结构撰写的相关探索下篇
查看>>
[Android Pro] android 4.4 Android原生权限管理:AppOps
查看>>
编译qemu的一个修改版本时遇到timer_settime@@GLIBC_2.2'的问题
查看>>
Android so文件生成
查看>>
HDU 3879 Base Station 最大权闭合图
查看>>
Codeforces 486C Palindrome Transformation(贪心)
查看>>
Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】
查看>>
linux svn启动和关闭
查看>>
Android 开源库获取途径整理
查看>>
Vector的浅析
查看>>