为什么 Java Vector(和 Stack)类被认为是过时的或已弃用的?

2022-08-31 04:07:25

为什么Java Vector被认为是一个遗留类,过时或已弃用?

在使用并发时,它的使用不是有效吗?

如果我不想手动同步对象,只想使用线程安全的集合,而不需要制作底层数组的新副本(就像这样做一样),那么使用吗?CopyOnWriteArrayListVector

怎么样,这是 的子类,我应该用什么来代替它?StackVector


答案 1

Vector在每个单独的操作上同步。这几乎从来都不是你想做的。

通常,您希望同步整个操作序列。同步单个操作既不太安全(例如,如果您迭代一个,您仍然需要取出一个锁以避免其他人同时更改集合,这将导致迭代线程中的一个),而且速度较慢(为什么在一次足够时反复取出一个锁)?VectorConcurrentModificationException

当然,即使您不需要,它也具有锁定的开销。

基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如Brian Henk先生所指出的,你可以使用诸如 Collections.synchronizedList 之类的调用来修饰一个集合 - 将“调整大小的数组”集合实现与“同步每个操作”位相结合的事实是设计不佳的另一个例子;装饰方法使关注点更干净。Vector

至于等价物 - 我会看看/开始。StackDequeArrayDeque


答案 2

Vector是1.0的一部分 - 最初的实现有两个缺点:

1.命名:向量实际上只是可以作为数组访问的列表,因此应该调用它(这是Java 1.2集合的替代)。ArrayListVector

2. 并发性:所有的 方法都是 ,因此您无法对同步进行细粒度控制。get()set()synchronized

和 之间没有太大区别,但您应该使用 。ArrayListVectorArrayList

从 API 文档。

从 Java 2 平台 v1.2 开始,该类被改造以实现 List 接口,使其成为 Java 集合框架的成员。与新的集合实现不同,Vector 是同步的。