Vector 和 ArrayDeque 类
Posted
技术标签:
【中文标题】Vector 和 ArrayDeque 类【英文标题】:Vector and ArrayDeque classes 【发布时间】:2012-05-17 06:22:42 【问题描述】:有什么区别?我昨天读到了 ArrayDeque 类,而我之前使用过 Vector 类。
【问题讨论】:
【参考方案1】:基础是:
Vector
实现了java.util.List
,它定义了允许基于索引访问元素的容器。它还实现了interface RandomAccess
,它向用户表明底层表示允许快速(通常是O(1)
)访问元素。
ArrayDeque
实现了java.util.Deque
,它定义了一个容器,支持从容器的开头和结尾快速添加和删除元素。
主要区别:
Vector
支持在容器中间添加元素,使用List.add(int index, E element)
或List.addAll(int index, Collection<? extends E> c)
的重载版本。
Vector
支持使用remove
方法从容器中间移除元素。
Vector
的set
和setElementAt
方法允许您进行就地元素交换(将Vector
中的一个对象替换为另一个对象,O(1)
操作)。
add
ing 到 Vector
的末尾是摊销的常数时间。添加到向量的开头或中间是线性时间操作 (O(n)
)。
ArrayDeque
已摊销固定时间 (O(1)
) 在容器前后添加/删除元素。
ArrayDeque
不允许您专门删除容器中某个位置的元素。该类的各种remove
、removeFirst
和removeLast
方法允许您稍微有限地删除元素。
ArrayDeque
带有使用类的方法,如队列(peek
、poll
、add
、addFirst
)和堆栈(offer
、push
、@) 987654354@、peekLast
、addLast
)或两者都喜欢(因此它是Double-Ended Queue)。
ArrayDeque
不支持在双端队列中间添加元素。
Vector
具有特殊的ListIterator
s,它允许您获取从容器中特定位置开始的迭代器,并且还支持添加、删除和设置元素。 ArrayDeque
的迭代器不支持那些额外的方法。
Vector
是一个同步容器,这意味着它已经包含了为多线程环境执行同步/锁定的代码。对于ArrayDeque
,如果您对容器进行多线程访问,则必须提供自己的同步代码。请注意,ArrayList
是 Vector
的非同步对应项。
【讨论】:
【参考方案2】:一些差异:
Vector 实现List
接口,而ArrayDeque 实现Queue
接口。这些是不同的接口,提供不同的操作集:Vector 是您的普通容器,而 *Queue
更面向多线程应用程序(生产者/消费者模式),因为它具有诸如 poll
、offer
等方法;
向量线程安全(它具有内置同步),ArrayDeque 不是线程安全的;
自 1.0 版起包含在 JDK 中的向量,自 1.6 版起包含在 ArrayDeque 中。
【讨论】:
【参考方案3】:根据 Oracle 文档,Vector 和 Stack 是遗留类,您应该改用 Arraylist 和 ArrayDeque。 https://docs.oracle.com/javase/tutorial/collections/implementations/index.html https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html 说“(这个类大致相当于 Vector,只是它是不同步的。)”
【讨论】:
以上是关于Vector 和 ArrayDeque 类的主要内容,如果未能解决你的问题,请参考以下文章