ArrayList源码分析
JDK7
- new ArrayList()底层创建了长度为10的Object[]数组elementData
- 当此次添加导致底层elementData数组容量不够(10),则扩容,每次扩容1.5倍,同时调用(
Arrays.copyOF()方法
)将原有数组种的数据复制到新的数组中
int newCapacity = oldCapacity + (oldCapacity >> 1);
- 建议开发中使用带参的构造器
new ArrayList(init);
,避免超出初始容量时进行扩容,提高效率
JDK8
- JDK8的时候,直接使用了静态空数组,并没有创建长度为10的数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- 当调用add的时候如果数组长度小于10并且没有初始化数组长度,则会比较数组小于10的话,会创建长度为10的数组
- 后续的添加操作和扩容与jdk7无异
private void grow(int minCapacity) {
// overflow-conscious code
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);
}
小结
- jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList对象的创建类似于单例的懒汉式,延迟了数组的创建,节省了内存。
网友评论