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 方法从容器中间移除元素。

VectorsetsetElementAt 方法允许您进行就地元素交换(将Vector 中的一个对象替换为另一个对象,O(1) 操作)。

adding 到 Vector 的末尾是摊销的常数时间。添加到向量的开头或中间是线性时间操作 (O(n))。

ArrayDeque 已摊销固定时间 (O(1)) 在容器前后添加/删除元素。

ArrayDeque 不允许您专门删除容器中某个位置的元素。该类的各种removeremoveFirstremoveLast 方法允许您稍微有限地删除元素。

ArrayDeque 带有使用类的方法,如队列(peekpolladdaddFirst)和堆栈(offerpush、@) 987654354@、peekLastaddLast)或两者都喜欢(因此它是Double-Ended Queue)。

ArrayDeque 不支持在双端队列中间添加元素。

Vector 具有特殊的ListIterators,它允许您获取从容器中特定位置开始的迭代器,并且还支持添加、删除和设置元素。 ArrayDeque 的迭代器不支持那些额外的方法。

Vector 是一个同步容器,这意味着它已经包含了为多线程环境执行同步/锁定的代码。对于ArrayDeque,如果您对容器进行多线程访问,则必须提供自己的同步代码。请注意,ArrayListVector 的非同步对应项。

【讨论】:

【参考方案2】:

一些差异:

Vector 实现List 接口,而ArrayDeque 实现Queue 接口。这些是不同的接口,提供不同的操作集:Vector 是您的普通容器,而 *Queue 更面向多线程应用程序(生产者/消费者模式),因为它具有诸如 polloffer 等方法; 向量线程安全(它具有内置同步),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 类的主要内容,如果未能解决你的问题,请参考以下文章

Deque双端队列

Queue集合 与 PriorityQueue ArrayDeque LinkedList实现类相关

ArrayDeque源码分析

集合中线程安全的类

ArrayDeque 源码分析

集合类框架_List相关知识