Vector 应该被弃用吗?

10
当我们不需要同步时,ArrayList比Vector更快。而当我们需要一个同步的集合时,最好使用同步包装器(如果我说错了,请纠正我),或者仅在对该集合进行调用时才同步代码。是否存在使用Vector的最佳选择情况?

我可能错了,但我相信HotSpot JVM可以确定特定对象是否需要同步,并在不必要时将其优化掉。例如,多年前引入了StringBuilder类作为非同步替代StringBuffer(以避免由于不必要的锁定而导致的性能损失)。然而,现在HotSpot可以优化掉StringBuffer的同步(如果被认为是不必要的),从而使其速度与StringBuilder相匹配。我想知道Vector是否也从这样的优化中受益... - Adam Paynter
有趣,我会查一下,如果我找到了什么,我会重新发布的。 - Michael
2
@Michael:我从Steve Yegge的《Dynamic Languages Strike Back》演讲中听说过这个(在演讲文稿中搜索“StringBuffer”)。他链接到了一篇关于Java 6中偏向锁的文章(http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.1.1)。 - Adam Paynter
1
@Adam Paynter:这是一种必须激活的优化(逃逸分析)(-XX:+DoEscapeAnalysis)。也许在Java 7中它是标准的。无论如何,我不认为同步在大多数通常的程序中会产生太多性能影响。 - Mnementh
2
奇怪,我不认为这个问题是“主观和争论性”的。看起来是一个合理的需要知道的事情。 - Adam Paynter
2
@Adam Paynter:同意,我对这个讨论非常感兴趣。对我来说,这个问题是客观的,而且是一个合理、具体的问题,我的组织里有很多人问过我类似的问题。也许提供的答案是主观的,但这不是提问者的错... - andersoj
4个回答

17

尽管在新代码中使用 Vector 很少是个好主意,但没有迫切需要弃用。虽然新的集合类更优秀,但使用 Vector 类并不会导致任何问题。

此外,有一些其他标准的Java API依赖于Vector API,并且无疑有成千上万的客户和第三方应用程序也在使用它。

基本上,弃用Vector 将造成不必要的破坏。如果代码可靠工作,即使慢一点,也没有必要强制人们更改它。


有人提出/暗示他们可以将Vector弃用而不(永远)删除它。但问题是:弃用警告会给真正的人员带来实际的工作。如果这样做是不必要的,那么忙碌的人们将默认屏蔽警告。(回想一下“狼来了”的故事....)


2
据我所知,使用Vector仅适用于具有依赖于它或1.2之前运行时环境的核心API。这也可能是一种舒适感。有些人只是喜欢Vector,因为那是他们最初使用的。更新:如此处所述,Vector现已被弃用。

2
如果你“最初使用”Vector,那么你要么从Java几乎一开始就开始使用它,要么是从非常老的书籍/教程中学习的。我怀疑后者占当前类使用量的90%。 - Michael Borgwardt
@Michael:有相当多的人(包括我自己)是从1.0开始使用Java的,尽管我希望大多数人都知道要使用更新的集合类。猜想这标志着我是一个乐观主义者... - Donal Fellows

1

因为有很多程序使用Vector。从jre中删除Vector意味着它们都将无法正常工作。另一方面,根据您的需要使用ArrayList或其他捆绑的List实现之一。


3
当然,显然删除它会造成混乱,但是@deprecated只会添加很多警告。无论如何,我并不期望在API中进行任何更改,只是需要确认Vector是无用的,或者存在应该使用它的情况。 - Michael

0

在Java中检查锁消除,现代JVM实现(Mustang)足够智能,可以优化共享和非共享对象的访问。 Mustang中的同步优化

因此,这并不重要(使用带有同步关键字的向量/数组列表); 但是弃用会导致编译时出现太多警告:(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接