为什么Java Vector(和Stack)类被视为过时或过时的?| Java Debug 笔记

205 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

为什么Java Vector(和Stack)类被视为过时或过时的?

为什么将Java Vector视为遗留类(已过时或已过时)?

使用并发时,使用它无效吗?

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

怎么样Stack,这是一个子类Vector,我应该怎么用,而不是它?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

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

通常,您要同步整个操作序列。同步单个操作既不安全(Vector例如,如果对进行迭代,则仍然需要锁,以避免其他人同时更改集合,否则会导致ConcurrentModificationException迭代线程中的错误),但同步速度也较慢(为什么一次就够了就反复拿出锁?)

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

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

至于Stack等效项-我会先看Deque/ ArrayDeque。

高分回答:

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

文章翻译自 kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…

**作者建议: 无法对同步进行精细控制 **

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️