java.util.Vector-备选方案

java.util.Vector-备选方案,java,vector,arraylist,Java,Vector,Arraylist,以前,当长度未知时,我总是认为向量适合用于非描述对象。据我所知,我认为它也是线程安全的 什么会改变不应该再使用的向量,以及替代方法是什么?您应该使用数组列表而不是向量Vector使用了内部同步,但对于实际的一致性来说,这几乎不够好,只有在不需要时才会减慢执行速度 另请参见。ArrayList现在是更好的类向量现在被认为是传统的,并且增加了线程安全的性能开销。您可以使用数组列表 如果需要同步版本,可以执行以下操作: ArrayList arrayList = new ArrayList(); L

以前,当长度未知时,我总是认为向量适合用于非描述对象。据我所知,我认为它也是线程安全的


什么会改变不应该再使用的
向量,以及替代方法是什么?

您应该使用
数组列表
而不是
向量
Vector
使用了内部同步,但对于实际的一致性来说,这几乎不够好,只有在不需要时才会减慢执行速度


另请参见。

ArrayList
现在是更好的类<代码>向量
现在被认为是传统的,并且增加了线程安全的性能开销。

您可以使用
数组列表

如果需要同步版本,可以执行以下操作:

ArrayList arrayList = new ArrayList();

List synchList = Collections.synchronizedList(arrayList);

当您需要
列表
实现但不需要线程安全时,请使用
ArrayList
;当您需要线程安全的
列表
实现时,请使用
CopyOnWriteArrayList

Vector
是Java 1.0中的遗留集合类。在Java 1.2(很久以前!)中,添加了新的集合类,包括
ArrayList
HashMap
,它们旨在取代传统的类
Vector
Hashtable

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

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

// 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);
//您的标准非同步列表
列表数据=新的ArrayList();
//使用此选项将其放入同步包装器中
List syncedData=集合。synchronizedList(数据);

有关更多信息,请参阅
集合.synchronizedList()
(和其他方法)的API文档。

很少做到“足够好以实现实际一致性”这一点很好。如果一个集合对多个线程可见,您可能应该使用(并完全理解)来自
java.util.concurrent
的适当集合。如果多个线程无法访问它,则
ArrayList
更便宜。消除多线程“可能”使用集合的灰色区域:不能使集合本质上是线程安全的;它的客户如何使用它一直是一个因素。现在,你知道Vector是否得到了改进,或者我们是否必须坚持ArrayList吗?@AquariusPower合同规定它需要使用同步,因此它无法真正得到改进。这就是说,现代JVM有时可以将同步作为优化来删除,但一般来说,使用ArrayList更好。奇怪的是,
Vector
没有被弃用。我想既然没有一对一的替换,他们就没有这样做。请注意,Hashtable也是如此——请改用HashMap。@skaffman
CopyOnWriteArrayList
或多或少是一对一的替换,因为它是线程安全的
List
实现。对于大多数用法,
CopyOnWriteArrayList
应该比
Vector
提供更好的性能如果需要线程安全列表,CopyOnWriteArrayList(在大多数情况下)比Collections提供更好的性能。synchronizedList(数据)@Dónal这不是真的。@StefanReich请详细说明CopyOnWriteArrayList在每次更改时都复制整个列表,因此如果您经常更改列表,则速度可能会非常慢。您需要记住,CopyOnWriteArrayList会在变异操作(添加、删除…)时复制整个数组。CopyOnWriteArrayList只应在遍历操作(get、iterate…)的数量远远超过变异操作时使用。资料来源: