ArrayList 底层结构和源码分析
ArrayList基本和注意事项
- ArrayList可以加入null,并且多个
- ArrayList 是由数组来实现数据存储的
- ArrayList 基本等同于Vector,但ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList
ArrayList 扩容机制
-
结论:
- ArrayList中维护了一个Object类型的数组elementData transient Object[] elementData
- 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,这扩容elementData为10,如需再次扩充,则扩充elementData为1.5倍
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容elementData为1.5倍
-
源码分析:
-
此处链接作为补充:jdk1.8ArrayList 扩容机制
-
== 创建了一个elementData空数组
-
==执行 list.add() ,1.先确认是否要扩容 2.然后再执行扩容
-
== 无参构造(DEFAUL_CAPACITY=10)第一次扩容为10
-
== (1)modCount++ : 记录当前集合被修改的次数 防止多个线程去修改它
(2)elementData.length() :目前的数组容量
(3)通过判断容量不够 就去调用grow(),去扩容
-
== 这里是最底层的扩容机制
(1)使用扩容机制,确定要扩容到多大
(2)第一次 初始容量为0 newCpapacity =10
(3)以后 都会1.5被扩容
(4)扩容使用的是 Arrays.copyof 这样的方法会保留原先的数据
-
用于测试的代码
// 使用ArrayList无参构造 ArrayList list = new ArrayList(); // 添加1-10个数据 for (int i = 1; i <=10; i++) { list.add(i); } // 添加11-15个数据 for (int j = 11; j <=15; j++) { list.add(j); } list.add(100); list.add(200); list.add(null);
-