为什么Java Vector (和Stack)类被认为是过时的或被弃用的?
为什么Java Vector (和Stack)类被认为是过时的或被弃用的?
Java的Vector为什么被认为是遗留类、过时或已弃用?
在处理并发时,使用Vector仍然合法吗?
如果我不想手动同步对象,只想使用一个线程安全的集合而不需要创建底层数组的副本(正如CopyOnWriteArrayList
所做的那样),那么使用Vector
是否可以?
至于Stack
,它是Vector
的子类,那么我应该使用什么代替它呢?
Vector 是 1.0 的一部分 -- 最初的实现有两个缺点:
1. 命名:矢量实际上只是可以像数组一样访问的列表,所以它应该被称为 ArrayList
(这是 Java 1.2 的集合替换 Vector
)。
2. 并发:所有的 get()
,set()
方法都是 synchronized
,因此无法对同步进行细粒度控制。
ArrayList
和 Vector
之间没有太大的区别,但是你应该使用 ArrayList
。
来自 API 文档。
自 Java 2 平台 v1.2 起,这个类被改装为实现 List 接口,成为 Java Collections Framework 的成员。与新的集合实现不同,Vector 是同步的。
Vector
会在每个单独的操作上进行同步。这几乎从来不是你想要做的。
通常,你想同步一整个操作序列。同步单个操作既不太安全(如果你遍历一个Vector
,例如,你仍然需要取出一个锁来避免其他人同时更改集合,这会导致在迭代线程中发生ConcurrentModificationException
),也更慢(为什么反复取锁,当一次足矣)?
当然,它也有锁定的开销,即使你不需要锁定也是如此。
基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如Mr Brian Henk所指出的,你可以使用诸如Collections.synchronizedList
等调用来装饰集合。Vector
结合了“调整大小的数组”集合实现和“在每个操作上同步”的部分,这是另一个设计不良的例子;装饰方法提供了更清晰的关注点分离。
至于Stack
的等价物-我会从Deque
/ArrayDeque
开始着手。