Vector和ArrayDeque类

时间:2012-05-08 18:19:09

标签: java arrays class vector

Vector和ArrayDeque类有什么区别?我昨天读到了关于ArrayDeque的类,而我之前使用过Vector类。

2 个答案:

答案 0 :(得分:9)

基础知识是:

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的{​​{1}}和set方法允许您进行就地元素交换(将setElementAt中的一个对象替换为另一个, Vector操作。

  • O(1)add的末尾是摊还的常数时间。添加到向量的开头或中间是线性时间操作(Vector)。

  • O(n)已经在容器的正面和背面分别添加/删除了元素的常量时间(ArrayDeque)。

  • O(1)不允许您专门删除容器中某个位置的元素。该类的各种ArrayDequeremoveremoveFirst方法允许您更有限地删除元素。

  • removeLast附带了使用类的方法,如队列(ArrayDequepeekpolladd)和堆栈一样(addFirstofferpushpoppeekLast),或两者兼有(因此它为Double-Ended Queue)。

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

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

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

答案 1 :(得分:4)

几乎没有差异:

  • Vector实现List接口,而ArrayDeque实现Queue接口。这些是不同的接口,提供不同的操作集合:Vector是您的vanilla容器,而*Queue更倾向于多线程应用程序(生产者/消费者模式),因为它具有poll等方法, offer等;
  • 矢量线程安全(它具有内置同步),ArrayDeque不是线程安全的;
  • 自版本1.0以来在JDK中包含的向量,自版本1.6以来的ArrayDeque。