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倍扩容。
- 执行流程同前。