【问题标题】:Vector and ArrayDeque classesVector 和 ArrayDeque 类
【发布时间】:2012-05-17 06:22:42
【问题描述】:

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

【问题讨论】:

    标签: java arrays class 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,只是它是不同步的。)”

        【讨论】:

          猜你喜欢
          • 2013-07-14
          • 2015-04-03
          • 2011-10-01
          • 1970-01-01
          • 2021-02-24
          • 2017-10-13
          • 1970-01-01
          • 2014-09-29
          • 2020-08-26
          相关资源
          最近更新 更多