ArrayList
使用Object
数组存储数组元素,并使用size
属性记录数组长度。数组
须要注意ArrayList
是非线程安全的。安全
ArrayList
的默认初始长度是多少?最大长度是多少?ArrayList
的默认初始长度是10
,是由DEFAULT_CAPACITY
设定的。线程
因为ArrayList
底层是用Object
数组存储元素,因此ArrayList
最大长度为Integer.MAX_VALUE
,即2147483647(2)
。这里须要注意常量MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8)
并非ArrayList
真正的最大长度,缘由能够参考hugeCapacity()
方法。code
ArrayList
是如何扩容的?ci
扩容发生在插入数组元素时(关键方法为grow()
方法)it
ArrayList
长度size
size
与minCapacity
比较来判断是否须要扩容newCapacity
为原数组长度oldCapacity
的1.5
倍(oldCapacity
带符号右移1
位并加上oldCapacity
)。newCapacity
长度超过Array的最大支持长度MAX_ARRAY_SIZE
则调用hugeCapacity()
进行特殊处理防止数组超出最大长度(int最大值)。ArrayList
扩容后是否会自动缩容?若是不能怎样进行缩容?ArrayList
只能自动扩容,不能自动缩容。若是须要进行缩容,能够调用ArrayList
提供的trimToSize()
方法。List
表面上是调用Arrays.copyOf()
方法,其实是Arrays.copyOf()
经过调用System.arraycopy()
方法确保高效复制数组。方法