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

4 浏览
0 Comments

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

Java的Vector为什么被认为是遗留类、过时或已弃用?

在处理并发时,使用Vector仍然合法吗?

如果我不想手动同步对象,只想使用一个线程安全的集合而不需要创建底层数组的副本(正如CopyOnWriteArrayList所做的那样),那么使用Vector是否可以?

至于Stack,它是Vector的子类,那么我应该使用什么代替它呢?

admin 更改状态以发布 2023年5月24日
0
0 Comments

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

1. 命名:矢量实际上只是可以像数组一样访问的列表,所以它应该被称为 ArrayList(这是 Java 1.2 的集合替换 Vector)。

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

ArrayListVector 之间没有太大的区别,但是你应该使用 ArrayList

来自 API 文档。

自 Java 2 平台 v1.2 起,这个类被改装为实现 List 接口,成为 Java Collections Framework 的成员。与新的集合实现不同,Vector 是同步的。

0
0 Comments

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

通常,你想同步一整个操作序列。同步单个操作既不太安全(如果你遍历一个Vector,例如,你仍然需要取出一个锁来避免其他人同时更改集合,这会导致在迭代线程中发生ConcurrentModificationException),也更慢(为什么反复取锁,当一次足矣)?

当然,它也有锁定的开销,即使你不需要锁定也是如此。

基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如Mr Brian Henk所指出的,你可以使用诸如Collections.synchronizedList等调用来装饰集合。Vector结合了“调整大小的数组”集合实现和“在每个操作上同步”的部分,这是另一个设计不良的例子;装饰方法提供了更清晰的关注点分离。

至于Stack的等价物-我会从Deque/ArrayDeque开始着手。

0