为什么Java Vector类被认为已经过时或被弃用?

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

使用并发时,它的使用是否有效?

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

怎么样Stack ,这是Vector一个子类,我应该用什么来代替它?


Vector在每个单独的操作上同步。 这几乎从来没有你想要做的。

通常你想同步整个操作序列。 同步单个操作不太安全(如果您遍历Vector ,例如,您仍然需要取出一个锁以避免其他人同时更改集合,这会在迭代线程中导致ConcurrentModificationException ),但同时速度较慢(为什么在一次足够的时候反复地重复锁定)?

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

基本上,在大多数情况下,这是一个非常有缺陷的同步方法。 正如Brian Henk先生指出的那样,您可以使用诸如Collections.synchronizedList之类的调用来装饰集合 - Vector将“调整大小的数组”集合实现与“同步每个操作”位相结合的事实是设计不佳的另一个例子; 装修方式让人更清楚地分离顾虑。

至于Stack等价物 - 我会先看看Deque / ArrayDeque


向量是1.0的一部分 - 原始实现有两个缺点:

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

并发性:所有的get()set()方法都是synchronized ,所以你不能对同步进行细粒度的控制。

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

从API文档。

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


除了已经提到的有关使用Vector的答案之外,Vector还有一系列与List接口不同的枚举和元素检索方法,开发人员(特别是那些在1.2之前学过Java的人)可以倾向于使用它们,如果它们在码。 尽管枚举速度更快,但它们并不检查集合是否在迭代过程中被修改,这可能会导致问题,并且鉴于可能选择Vector作为其同步 - 伴随多个线程的访问,这使得它成为一个特别有害的问题。 这些方法的使用还会将很多代码耦合到Vector,因此使用不同的List实现替换它并不容易。

链接地址: http://www.djcxy.com/p/2127.html

上一篇: Why is Java Vector class considered obsolete or deprecated?

下一篇: Is it okay to throw NullPointerException programmatically?