ArrayList底层结构和源码分析
// 无参构造器创建ArrayList对象
// ArrayList list =new ArrayList(); // 断点1
ArrayList list =new ArrayList(8); // 断点2
// 添加1-10数据
for (int i = 0; i <= 10; i++) {
list.add(i);
}
// 添加11-15数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
- permits all element,including null,ArrayList 可以加入(多个)null,
- ArrayList是由数组来实现存储的
- ArrayList吧基本等于Vector,除了ArrayList是线程不安全(执行效率高)通过源码可以查看到多线程不使用ArrayList。
通过源码可以得知add方法没有synchronized;即没有线程安全控制。
- ArrayList中维护了一个Object类型的数组elementData. transient(表示,“瞬间”,该属性不会被序列化) Object[] elementsData;
- 当创建了ArrayList对象时,如果使用无参构造器,则初始化elementData容量为0,第一次添加,则扩容elementData为10,如需要再次扩容则扩容为1.5倍。
- 如果使用的是一个指定大小的构造器,则初始化elementData容量为指定大小,扩容为1.5倍(当前大小+当前大小/2)。
创建了一个空的elementData数组
执行list.add添加数据,确定是否需要扩容。
确定minCapacity(第一次扩容为10)
if判断elementData大小是否需要扩容
注意:idea在Debug是默认简化显示,需要完整显示则需要设置
// grow扩容源码
//使用扩容机制确定扩容,首次newCapacity=10,往后每次按1.5倍扩容
//扩容使用的是Arrays.copyOf()
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);
断点2
创建了一个指定大小的elementData数组
如果是有参数的构造器没扩容机制:
- 第一次扩容,按照elementData的1.5倍扩容。
- 执行流程同前。
本文作者:Dr丶云幕
本文链接:https://www.cnblogs.com/vayenge/p/18212850
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端