【问题标题】:java.util.Vector - alternativesjava.util.Vector - 替代品
【发布时间】:2010-12-20 00:18:11
【问题描述】:

以前,当长度未知时,我一直认为 Vector 可以很好地用于非描述性对象。据我所知,我认为它也是线程安全的

什么会改变 Vector 不应该再使用,还有什么替代方案?

【问题讨论】:

  • 奇怪的是Vector 还没有被弃用。我想既然没有一对一的替代品,他们就没有这样做。
  • 请注意,Hashtable 也是如此——改用 HashMap。
  • @skaffman CopyOnWriteArrayList 或多或少是一对一的替代品,因为它是线程安全的 List 实现。对于大多数用途,CopyOnWriteArrayList 应该提供比 Vector 更好的性能

标签: java vector arraylist


【解决方案1】:

您应该使用ArrayList 而不是Vector。 Vector 使用了内部同步,但这对于实际的一致性来说很少足够好,并且只会在不需要时减慢执行速度。

另见this stackoverflow question。

【讨论】:

  • 关于很少“足够好以实现实际一致性”的好点。如果一个集合对多个线程可见,您可能应该使用(并彻底理解)来自java.util.concurrent 的适当集合。如果它不能被多个线程访问,ArrayList 更便宜。消除集合“可能”被多个线程使用的灰色区域:您不能使集合本质上是线程安全的;客户如何使用它始终是一个因素。
  • 现在,你知道 Vector 是否得到了改进,还是我们必须坚持使用 ArrayList?
  • @AquariusPower 合约规定需要使用同步,所以无法真正改进。也就是说,现代 JVM 有时可以将同步移除作为一种优化,但总的来说,使用 ArrayList 会更好。
【解决方案2】:

您可以改用ArrayList。

如果你需要一个同步版本,你可以这样做:

ArrayList arrayList = new ArrayList();

List synchList = Collections.synchronizedList(arrayList);

【讨论】:

    【解决方案3】:

    ArrayList 现在是更好用的类。 Vector 现在被视为旧版,并且具有线程安全的额外性能开销。

    【讨论】:

      【解决方案4】:

      当您需要List 实现但不需要线程安全时使用ArrayList,当您需要线程安全的List 实现时使用CopyOnWriteArrayList。

      【讨论】:

      【解决方案5】:

      Vector 是 Java 1.0 的遗留集合类。在 Java 1.2(很久以前!)中,添加了 Collections Framework,其中包括新的集合类,例如 ArrayList 和 HashMap,它们旨在替换旧类 Vector 和 Hashtable。

      如前所述,遗留集合类具有内置同步,这对于许多应用程序来说是不必要的。同步有性能开销,所以如果没有必要,你不应该使用它。

      在某些情况下(当您的程序是多线程的,并且多个线程访问相同的数据时)您需要同步您的集合。有些人会使用旧的 Vector 或 Hashtable 类,但更好的方法是使用同步包装器,例如 ArrayList:

      // Your standard, unsynchronized list
      List<String> data = new ArrayList<String>();
      
      // Use this to put it into a synchronization wrapper
      List<String> syncedData = Collections.synchronizedList(data);
      

      有关详细信息,请参阅Collections.synchronizedList()(和其他方法)的 API 文档。

      【讨论】:

      • 如果你需要一个线程安全的 List,CopyOnWriteArrayList 提供比 Collections.synchronizedList(data) 更好的性能(在大多数情况下)
      • @Dónal 这不是真的。
      • @StefanReich 请详细说明
      • CopyOnWriteArrayList 在每次更改时复制整个列表,因此如果您对列表进行大量更改,它可能会非常慢。
      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2011-06-10
      • 2014-04-18
      • 2012-04-08
      • 2012-07-09
      • 2011-03-31
      • 2023-03-12
      • 2017-02-26
      相关资源
      最近更新 更多