简介
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() 方法确保高效复制数组。