《JDK API 1.8 中文版》是Java开发者不可或缺的手册,提供了Java平台标准版8中所有类和接口的详细中文文档。
可调整大小的数组实现了List接口,并支持所有可选列表操作以及包括null在内的所有元素类型。除了实现List接口外,该类还提供了一些方法来控制内部使用的存储数组的容量。
与Vector相比(不同之处在于它是非同步的),这个类提供了类似的功能。`size()`、`isEmpty()`、`get()`、`set()`、`iterator()` 和 `listIterator()` 操作在固定时间内运行;而添加操作以摊余常数时间完成,即向ArrayList中增加n个元素需要O(n)的时间复杂度。
除此之外的所有其他操作都具有线性时间复杂度。与LinkedList实现相比,该类的常量因子较低。每个ArrayList实例都有一个容量:用于存储列表中的元素的数组大小,并且总是至少等于当前列表大小。
当向ArrayList添加新元素时,其容量会自动增长;虽然没有规定具体的扩容策略细节,但保证每次添加操作的时间成本不变(摊余时间复杂度)。应用程序可以通过预先调用`ensureCapacity()`方法来增大ArrayList实例的初始容量,从而减少后续数组重新分配的数量。
请注意,此实现是非同步的:如果多个线程同时访问同一个ArrayList对象,并且至少有一个线程对列表进行结构修改操作,则必须从外部对该类进行同步处理(例如通过封装该类的对象)。若没有天然提供此类保护的对象存在,请考虑使用`Collections.synchronizedList()`方法来包装ArrayList实例。
迭代器由此实现提供的两个方法:iterator() 和 listIterator(),是快速失败的。如果在创建这些迭代器之后对列表进行了结构性修改(除了通过迭代器自身调用remove或add),则它们将抛出ConcurrentModificationException异常。因此,在面对并发修改时,这种设计可以迅速而干净地处理错误情况;而不是在未来不确定的时间点冒着任意非确定性行为的风险。
请注意:快速失败的迭代器的行为无法在所有情况下保证其可靠性(特别是在不同步的情况下)。然而,它的目标是尽力避免导致程序崩溃或数据损坏的情况发生。因此,不应依赖于ConcurrentModificationException异常来确保应用程序的正确性;而是应该将其视为编程错误的一种标志,并用于调试和测试阶段以提高代码质量。