fjs*_*jsj 661 java stack vector deprecated obsolete
为什么Java Vector被认为是遗留类,已过时或已弃用?
在使用并发时,它的使用是否有效?
如果我不想手动同步对象而只想使用线程安全的集合而不需要制作底层数组的新副本(就像CopyOnWriteArrayList那样),那么它可以使用Vector吗?
怎么样Stack,这是一个子类Vector,我应该怎么用,而不是它?
Jon*_*eet 641
Vector同步每个单独的操作.这几乎不是你想要做的.
通常,您希望同步整个操作序列.同步单个操作既不安全(Vector例如,如果你遍历a ,你仍然需要取出一个锁以避免其他人同时更改集合,这会导致ConcurrentModificationException迭代线程中的一个)但也会更慢(为什么一旦足够就反复取出锁?
当然,即使你不需要,它也有锁定的开销.
基本上,在大多数情况下,这是一种非常有缺陷的同步方法.正如Brian Henk先生指出的那样,您可以使用诸如以下调用来装饰集合Collections.synchronizedList- Vector将"调整大小的数组"集合实现与"同步每个操作"位相结合的事实是设计不佳的另一个例子; 装饰方法可以更清晰地分离顾虑.
至于一个Stack等价物 - 我会看Deque/ ArrayDeque开始.
Jus*_*tin 80
Vector是1.0的一部分 - 原始实现有两个缺点:
1.命名:向量实际上只是可以作为数组访问的列表,因此它应该被调用ArrayList(这是Java 1.2 Collections的替代品Vector).
2.并发性:所有的get(),set()方法是synchronized,所以你不能有超过同步进行细粒度控制.
ArrayList和之间没有太大区别Vector,但你应该使用ArrayList.
来自API文档.
从Java 2平台v1.2开始,这个类被改进以实现List接口,使其成为Java Collections Framework的成员.与新的集合实现不同,Vector是同步的.
Yis*_*hai 41
除了已经陈述的关于使用Vector的答案之外,Vector还有许多关于枚举和元素检索的方法,这些方法与List接口不同,开发人员(特别是那些在1.2之前学习Java的人)可能倾向于使用它们,如果他们在码.尽管枚举速度更快,但它们不会检查集合是否在迭代期间被修改,这可能会导致问题,并且考虑到可能会选择Vector进行同步 - 通过多线程的话务员访问,这使得它成为一个特别有害的问题.这些方法的使用也将大量代码耦合到Vector,因此用不同的List实现替换它并不容易.
Bri*_*enk 14
您可以使用synchronizedCollection/List方法java.util.Collection从非线程安全的集合中获取线程安全集合.
java.util.Stack继承了同步开销java.util.Vector,这通常是不合理的.
不过,它继承了很多东西.事实java.util.Stack extends java.util.Vector是面向对象设计中的错误.纯粹主义者会注意到它除了传统上与堆栈相关的操作之外还提供了许多方法(即:push,pop,peek,size).它也可以做到search,elementAt,setElementAt,remove,和其他许多随机存取操作.基本上由用户决定不使用非堆栈操作Stack.
出于这些性能和OOP设计的原因,JavaDocjava.util.Stack建议ArrayDeque作为自然替代品.(deque不仅仅是一个堆栈,但至少它仅限于操纵两端,而不是随机访问所有内容.)
| 归档时间: |
|
| 查看次数: |
215321 次 |
| 最近记录: |