博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList动态扩容
阅读量:4625 次
发布时间:2019-06-09

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

1、ArrayList 的内部实现是一个 Object 数组,当该 ArrayList 的 size 到达当前的容量最大值后,再插入数据就会触发扩容。

2、当使用构造器:public ArrayList() 构造的话,此时ArrayList的容量为0,直到插入了第一条数据,才使用 DEFAULT_CAPACITY(默认容量)=10。

3、扩容函数:

//传参为所需要的最小容量,如果是调用add()触发的话,那参数肯定是size+1private void grow(int minCapacity) {    //旧的容量    int oldCapacity = elementData.length;    //新的容量采用位移运算,大约等于旧的容量的1.5倍    int newCapacity = oldCapacity + (oldCapacity >> 1);    //如果新的容量还是不够用的话(如果是调用add()触发的话,肯定不会不够用的)    if (newCapacity - minCapacity < 0)        //直接让新的容量 = 所需要的最小容量        newCapacity = minCapacity;    //如果新的容量大于ArrayList所允许的最大容量    if (newCapacity - MAX_ARRAY_SIZE > 0)        //???        newCapacity = hugeCapacity(minCapacity);    //最后用数据复制的方式完成扩容    elementData = Arrays.copyOf(elementData, newCapacity);}

4、同样的,此类非线程安全的集合类会涉及到 Fail-Fast 机制:

  内部一个 volatile 类型的 modCount 变量,对内容的修改都将++这个值,并且修改器会判断 modCount 跟 expectedModCount 是否相等,如果不相等就表示已经有其他线程修改了。

 

参考:

转载于:https://www.cnblogs.com/LinsenLi/p/10481535.html

你可能感兴趣的文章
OpenCV特征点检测——ORB特征
查看>>
mysql的csv数据导入与导出
查看>>
leetcode笔记:Pascal&#39;s Triangle
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
Shell——windows上写完放入linux的时候需要注意的问题
查看>>
65条常用的正则表达式
查看>>
Vscode断点调试PHP
查看>>
做前端要做的6大事
查看>>
LeetCode 813. Largest Sum of Averages
查看>>
vSphere、Hyper-V与XenServer 你选哪个?
查看>>
java.lang.UnsupportedClassVersionError
查看>>
实现接口必须要加注解@Override吗
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>
20、docker swarm
查看>>