简介
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()
方法。 -
ArrayList
是如何扩容的?扩容发生在插入数组元素时(关键方法为
grow()
方法)- 先计算增加完新元素后的
ArrayList
长度size
- 然后
size
与minCapacity
比较来判断是否需要扩容 - 扩容时一般扩容为新数组长度
newCapacity
为原数组长度oldCapacity
的1.5
倍(oldCapacity
带符号右移1
位并加上oldCapacity
)。 - 特殊情况是存在
newCapacity
长度超过Array的最大支持长度MAX_ARRAY_SIZE
则调用hugeCapacity()
进行特殊处理防止数组超出最大长度(int最大值)。
- 先计算增加完新元素后的
-
ArrayList
扩容后是否会自动缩容?如果不能怎样进行缩容?ArrayList
只能自动扩容,不能自动缩容。如果需要进行缩容,可以调用ArrayList
提供的trimToSize()
方法。 - ArrayList底层数组扩容时是如何保证高效复制数组的?
表面上是调用
Arrays.copyOf()
方法,实际上是Arrays.copyOf()
通过调用System.arraycopy()
方法确保高效复制数组。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。