为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2019-05-27 11:15:16
为什么Java Vector(和Stack)类被认为已过时或已弃用?为什么Java Vector被认为是遗留类,已过时或已弃用?在使用并发时,它的使用是否有效?如果我不想手动同步对象而只想使用线程安全的集合而不需要制作底层数组的新副本(就像CopyOnWriteArrayList那样),那么它可以使用Vector吗?怎么样Stack,这是一个子类Vector,我应该怎么用,而不是它?
查看完整描述

4 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

Vector同步每个单独的操作。这几乎不是你想要做的。

通常,您希望同步整个操作序列。同步单个操作的安全性较低(Vector例如,如果你遍历一个,你仍然需要取出一个锁来避免其他人同时更改集合,这会导致ConcurrentModificationException迭代线程中的一个)但也会更慢(为什么一旦足够就反复取出锁?

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

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

至于一个Stack等价物 - 我会看DequeArrayDeque开始。


查看完整回答
反对 回复 2019-05-27
?
波斯汪

TA贡献1811条经验 获得超4个赞

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是同步的。


查看完整回答
反对 回复 2019-05-27
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

除了已经陈述的关于使用Vector的答案之外,Vector还有许多关于枚举和元素检索的方法,这些方法与List接口不同,开发人员(特别是那些在1.2之前学习Java的人)可能倾向于使用它们,如果他们在码。尽管枚举速度更快,但它们不会检查集合是否在迭代期间被修改,这可能会导致问题,并且考虑到可能会选择Vector进行同步 - 通过多线程的话务员访问,这使得它成为一个特别有害的问题。这些方法的使用也将大量代码耦合到Vector,因此用不同的List实现替换它并不容易。


查看完整回答
反对 回复 2019-05-27
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以使用synchronizedCollection / List方法java.util.Collection从非线程安全的集合中获取线程安全集合。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 3441 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号