您似乎将ArrayList用于所有目的。Java中还有其他List-type比ArrayList更适合某些情况。您应该查看一下这些内容,并尝试了解何时使用哪个列表。在这种特定情况下,LinkedList更好。
我也倾向于ArrayList
大量使用,并且看不到选择其他列表类型背后的逻辑。
该List
文档显示五个主要List
子类:ArrayList
,CopyOnWriteArrayList
,LinkedList
,Stack
,和Vector
。
从ArrayList
文档中
size isEmpty,get,set,iterator和listIterator操作在恒定时间内运行。加法运算以固定的固定时间运行,即,添加n个元素需要O(n)时间。所有其他操作均以线性时间运行(大致而言)。与LinkedList实现相比,常数因子较低。
这表明它ArrayList
通常会表现出色LinkedList
(此问题被强烈质疑的问题支持),尽管LinkedList
文档并不能很好地说明性能:
所有操作均按双向链表的预期执行。
CopyOnWriteArrayList
它仅对不变的列表有用,因为每次修改的完整快照对于正常使用而言似乎都非常昂贵。
即使是Stack
文档,也不建议使用它:
Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。
由于Vector
是同步的,其余List
子类却不同步,所以在我看来,这Vector
将是线程安全环境中的最佳选择。
但是,即使在阅读了文档之后,我仍然认为我不明白TwoThe的答案来自何处。CopyOnWriteArrayList
而且Vector
每个似乎都有一个专门的用例,Stack
似乎不值得使用,并且ArrayList
似乎优于LinkedList
。
我在这里想念的是什么?在什么情况下,另一种List
实现方法会优于ArrayList
?
我同意这ArrayList
是许多用途的正确选择。LinkedList
如前所述,每个元素使用8或16个字节的内存作为指针,索引为O(length)。
那有什么LinkedLists
优势呢?
remove()
迭代期间的删除是恒定时间。有了ArrayList
O(长度)。ArrayList
s空间不足时,将在后台分配更大的内存块,并复制所有内容。虽然每个元素在许多操作上的摊销时间对于每个元素都是恒定的,但个人的成本add()
为O(length)。如果这种定期延迟是不可接受的,则不能使用ArrayList
。至于其他的,Vector
可以追溯到Java的最早时代。这是线程安全的。由于这会增加每个操作的成本,因此不赞成使用或多或少使用它ArrayList
。当需要线程安全时,可以在SynchronizedList
周围使用包装器ArrayList
。类似地Stack
,或多或少不赞成使用更现代的线程安全Deque
。
CopyOnWriteArrayList
是一个线程安全数据列表,它通过某种不寻常的措施来确保其安全性,该措施在任何元素发生更改时都会复制整个数组。尽管这听起来很疯狂,但是如果有很多线程在同一个数组上进行迭代是有意义的,因为更改不必等待所有迭代完成,而其他并发列表通常就是这种情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句