以前,我总是以为Vector在长度未知的情况下可以很好地用于非描述对象。 据我所知,我也认为它也是线程安全的
不再使用Vector会发生什么变化,替代方案是什么?
很好奇Vector尚未被弃用。 我想既然没有一对一的替代方法,他们还没有这样做。
请注意,对于Hashtable也是这样,请改用HashMap。
就其线程安全List实现而言,@skaffman CopyOnWriteArrayList或多或少是一对一的替换。 对于大多数用法,CopyOnWriteArrayList应该提供比Vector更好的性能。
您应该使用ArrayList而不是Vector。 Vector使用了内部同步,但是对于实际的一致性而言,这很少够好,并且仅在确实不需要时才减慢执行速度。
另请参阅此stackoverflow问题。
关于很少有"足以达到实际一致性"的好点。如果一个集合对多个线程可见,则您可能应该使用(并充分理解)java.util.concurrent中的适当集合。而且,如果不能通过多个线程访问它,则ArrayList会更便宜。消除多个线程可能"使用"集合的灰色区域:您不能使集合本质上是线程安全的;客户如何使用它始终是一个因素。
如今,您知道Vector是否已得到改进,还是必须坚持使用ArrayList?
@AquariusPower合同指定它需要使用同步,因此无法真正进行改进。也就是说,现代JVM有时可以删除同步作为一种优化,但总的来说,使用ArrayList更好。
您可以改用ArrayList。
如果需要同步版本,可以执行以下操作:
ArrayList arrayList = new ArrayList();
List synchList = Collections.synchronizedList(arrayList);
当需要List实现但不需要线程安全时,请使用ArrayList;当您需要线程安全的List实现时,请使用CopyOnWriteArrayList。
您需要记住,CopyOnWriteArrayList在更改操作(添加,删除...)上复制整个数组。仅当遍历操作(获取,迭代...)远远超过变异操作时,才应使用CopyOnWriteArrayList。来源:docs.oracle.com/javase/7/docs/api/java/util/concurrent/
现在,ArrayList是更好使用的类。 Vector现在被认为是旧版,并且具有线程安全性,从而增加了性能开销。
Vector是Java 1.0的旧式收集类。在Java 1.2中(很久以前!),添加了Collections Framework,其中包括新的集合类,例如ArrayList和HashMap,这些类旨在替换旧的类Vector和Hashtable。
如前所述,旧版收集类具有内置的同步,这对于许多应用程序来说是不必要的。同步具有性能开销,因此,如果不必要,则不应使用它。
在某些情况下(当您的程序是多线程的,并且多个线程访问相同的数据时),您需要同步集合。某些人会使用旧的Vector或Hashtable类,但是更好的方法是使用带有ArrayList的同步包装:
// Your standard, unsynchronized list
List data = new ArrayList();
// Use this to put it into a synchronization wrapper
List syncedData = Collections.synchronizedList(data);
有关更多信息,请参见Collections.synchronizedList()的API文档(和其他方法)。
如果您需要线程安全的List,则在大多数情况下,CopyOnWriteArrayList可提供比Collections.synchronizedList(data)更好的性能。
@Dnal那不是真的。
@StefanReich请详细说明
CopyOnWriteArrayList每次更改都会复制整个列表,因此,如果您对列表进行大量更改,它可能会变得非常慢。