【问题标题】:ArrayList vs. Vectors in Java if thread safety isn't a concern如果线程安全不是问题,Java 中的 ArrayList 与 Vectors
【发布时间】:2010-09-22 23:10:55
【问题描述】:

VectorArrayList 的性能真的有那么大的区别吗?在线程安全不是问题的情况下始终使用 ArrayList 是一种好习惯吗?

【问题讨论】:

    标签: java performance collections


    【解决方案1】:

    如果线程安全不是问题,ArrayList 会更快,因为它不需要同步。不过,您应该始终将变量声明为 List,以便以后可以根据需要更改实现。

    我更喜欢明确地处理我的同步,因为很多操作需要多次调用。例如:

    if (!myList.isEmpty()) { 
        myList.get(0);
    }
    

    应该是:

    synchronized (myList) {
       if (!myList.isEmpty()) { 
           myList.get(0);
       }
    }
    

    【讨论】:

    • 依赖 synchnizedList 包装器是在这些多调用情况下常犯的错误,并且会导致难以发现错误,因为您认为自己做得正确......
    • 是的,如果没有进一步的外部同步,同步列表的应用并不多。 Swing text 的 Document 也有同样的问题(JDK7 中删除了一些疯狂的线程安全声明)。
    【解决方案2】:

    Vector 起源于Collections API 之前的时代,并且已经被改造成为它的一部分。根据我的阅读,它不被弃用的原因是因为核心 API 依赖于它。

    ArrayList 是作为 Collections API 的一部分从头开始编写的,因此应该使用它,除非您需要支持低至 1.2 的 Java 版本。

    如果你需要一个线程安全的ArrayList,你可以使用静态工厂方法Collections.synchronizedList(new ArrayList<type>);来生成你的列表。

    【讨论】:

    • 是的,除非您的目标是 J2ME/pre 1.2 J2SE,否则请使用 ArrayList。
    • 我同意; Vector 仅用于支持旧的 JVM。即使您需要并发,也请使用 java.util.concurrent 集合或适当的 Collections.synchronizedXXX 包装器,而不是 Vector(Blechtor!)。
    【解决方案3】:

    如果线程安全不是问题,您应该始终使用ArrayList。 Vector 具有同步开销,并且已经证明ArrayListVector 之间的性能差异非常大。你可以用谷歌搜索很多性能基准。

    这是Timing & Performance

    【讨论】:

      【解决方案4】:

      忽略同步,VectorArrayList 之间的主要区别在于,Vector 是一个可调整大小的数组(类似于 C++ STL 向量),而ArrayList 是一个恰好由数组支持的 List。

      区别体现在setSize() 方法中。 ArrayList 中没有等效的方法。一些前 C++ Java 开发人员对此束手无策。有许多简单方法可以解决它,所以这应该不是问题。

      不要错误地告诉 C++ 开发人员 ArrayList 等同于 std::vector。你永远不会听到它的结束。

      【讨论】:

        【解决方案5】:

        ArrayList 与向量

        1。同步和线程安全

        Vector 和 ArrayList 之间最重要的区别是 Vector 是同步的,而 ArrayList 不是,这意味着所有在结构上修改 Vector 的方法,例如add ()remove () 是同步的,这使其成为线程安全的,并允许它在多线程和并发环境中安全使用。另一方面,ArrayList 方法不同步,因此不适合在多线程环境中使用。

        2。速度和性能

        ArrayList 比 Vector 快得多。由于 Vector 是同步的并且是线程安全的,因此它付出了同步的代价,这使得它有点慢。另一方面,ArrayList 不同步且速度不快,这使其成为单线程访问环境中的明显选择。

        3。容量

        每当 Vector 超过指定的阈值时,它都会按照 capacityIncrement 字段中指定的值自行增加,而您可以通过调用 ensureCapacity() 方法来增加 ArrayList 的大小。

        4。枚举和迭代器

        Vector 可以通过调用 elements() 方法返回它持有的项目的枚举,该方法与 Iterator 和 ArrayList 返回的 ListIterator 不同,它不是快速失败的。

        5。旧版

        值得记住的另一点是 Vector 是 JDK 1.0 附带的那些类之一,最初不是 Collection 框架的一部分,但在以后的版本中,它被重构为实现 List 接口,以便它可以成为集合框架的一部分

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 2018-04-08
          • 2019-12-01
          • 1970-01-01
          相关资源
          最近更新 更多