【发布时间】:2012-05-17 06:22:42
【问题描述】:
Vector 和 ArrayDeque 类有什么区别?我昨天读到了 ArrayDeque 类,而我之前使用过 Vector 类。
【问题讨论】:
Vector 和 ArrayDeque 类有什么区别?我昨天读到了 ArrayDeque 类,而我之前使用过 Vector 类。
【问题讨论】:
基础是:
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) 操作)。
adding 到 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 具有特殊的ListIterators,它允许您获取从容器中特定位置开始的迭代器,并且还支持添加、删除和设置元素。 ArrayDeque 的迭代器不支持那些额外的方法。
Vector 是一个同步容器,这意味着它已经包含了为多线程环境执行同步/锁定的代码。对于ArrayDeque,如果您对容器进行多线程访问,则必须提供自己的同步代码。请注意,ArrayList 是 Vector 的非同步对应项。
【讨论】:
一些差异:
List 接口,而ArrayDeque 实现Queue 接口。这些是不同的接口,提供不同的操作集:Vector 是您的普通容器,而 *Queue 更面向多线程应用程序(生产者/消费者模式),因为它具有诸如 poll、offer 等方法;【讨论】:
根据 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,只是它是不同步的。)”
【讨论】: