源码分析——new ArrayList() 和 new ArrayList(0)区别
1、分析
初始化
都是初始化为一个空的Object[],看着没差别,实际主要区别在扩容上
扩容
ArrayList():ensureCapacity方法计算出来的minCapacity是10
ArrayList(0):ensureCapacity方法计算出来的minCapacity是0
扩容规则:newCapacity = oldCapacity + (oldCapacity / 2),即扩为原来的1.5倍
ArrayList():0、1、2、3、4、6、9...Integer.MAX_VALUE - 8
ArrayList(0):10、15、22、33、49...Integer.MAX_VALUE - 8
为什么最大容量为 Integer.MAX_VALUE - 8?
数组对象有一个额外的元数据,用于表示数组的大小(8bytes)
2、总结
都初始化为一个空的Object[],但对象不同,区别在扩容规则不一样
在JDK7中,ArrayList()实际上是调用了ArrayList(10),因为没有指定动态数组的初始容量,JDK会自动给动态数组初始化一个容量,以减少插入少量元素时动态数组的扩容开销
在JDK8中,基本差不多,只不过采用延迟初始化策略