ArrayList 源码
1、ArrayList的类关系:
2、属性及方法
2.1 构造
三个构造方法分别对应:
通过传入初始化容器大小构造数组列表
构造一个空的数组列表
通过传入的集合数据构造数组列表容器
3.1方法
clone的拷贝模式?
ArrayList默认clone方法使用Arrays.copyof是浅拷贝(将新的数组引用原数组的对象,修改数组元素会对拷贝后的数组有影响。)
锁升级?
3、操作
由于ArrayList底层通过有序列表实现,其插入操作和删除操作时间时间复杂度是O(n),查找操作时间复杂度是O(1)
4、存储控制
构造ArrayList默认的大小是10
增长策略:
1 private void grow( int minCapacity) { 2 // overflow-conscious code 3 int oldCapacity = elementData .length ; 4 int newCapacity = oldCapacity + (oldCapacity >> 1);//按1.5倍增长 5 if (newCapacity - minCapacity < 0) 6 newCapacity = minCapacity ; 7 if (newCapacity - MAX_ARRAY_SIZE > 0) 8 newCapacity = hugeCapacity( minCapacity ); 9 // minCapacity is usually close to size, so this is a win: 10 elementData = Arrays.copyOf( elementData , newCapacity ); 11 } 12 13 private static int hugeCapacity( int minCapacity) { 14 if (minCapacity < 0) // overflow 15 throw new OutOfMemoryError(); 16 return (minCapacity > MAX_ARRAY_SIZE) ? 17 Integer. MAX_VALUE : 18 MAX_ARRAY_SIZE ; 19 }
ArrayList支持的最大值:
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
5、并发
ArrayList在add、set等操作中都没有类似 Synchronization 、lock等处理,该类是非并发安全的类,在并发中应该由开发人员自行控制并发的安全性,或者使用并发安全的集合类替换。