为什么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
,所以你不能对同步进行细粒度的控制。
ArrayList
和Vector
之间没有太大区别,但是您应该使用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?