ArrayList底层结构和源码分析
【摘要】 @[toc] 1. ArrayList 的注意事项permits all elements, including null , ArrayList可以加入null,并且多个。 ArrayList arrayList = new ArrayList(); arrayList.add(null); arrayList.add("兮动人"); arrayList.add(null); System...
@[toc]
1. ArrayList 的注意事项
- permits all elements, including null ,
ArrayList
可以加入null
,并且多个。
ArrayList arrayList = new ArrayList();
arrayList.add(null);
arrayList.add("兮动人");
arrayList.add(null);
System.out.println(arrayList);
- ArrayList是由 数组 来实现数据存储的
ArrayList
基本等同于Vector
,除了ArrayList
是 线程不安全(执行效率高) 。
看源码,如 :add
方法没有synchronized
(同步)修饰。
在多线程情况下,不建议使用ArrayList。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
2. ArrayList 的底层操作机制源码分析
-
ArrayList中维护了一个
Object
类型的数组elementData
。[debug看源码]
transient Object[] elementData;
,transient
表示瞬间,短暂的,表示该属性不会被序列化
-
当创建ArrayList对象时,如果使用的是无参构造器,则初始值
elementData
容量为0
,第1
次 添加,则扩容elementData
为10
,如需要再次扩容,则扩容elementData
为1.5
倍。
- 无参构造器-扩容
- 如果使用的是指定大小的构造器,则初始
elementData
容量为指定大小,如果需要扩容,则直接扩容elementData
为1.5
倍。
- 指定大小的构造器–扩容
- 建议:去debug一把我们的ArrayList的创建和扩容的流程。
- debug 查看 ArrayList 源码分析
//使用无参构造器创建 ArrayList 对象
//ArrayList list = new ArrayList();
ArrayList list = new ArrayList(8);
//使用 for 给 list 集合添加 1-10 数据
for (int i = 1; i <= 10; i++) {
list.add(i);
}
//使用 for 给 list 集合添加 11-15 数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
-
注意:Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据,需要设置如下
-
ArrayList 无参构造分析:
-
可以看到 ArrayList 第一次初始化后的
elementData
是个空数组
-
ArrayList 有参分析
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)