Java Vector应该被弃用吗?

Java Vector应该被弃用吗?,java,vector,synchronization,Java,Vector,Synchronization,当我们不需要同步时,ArrayList比Vector快。当我们确实需要一个同步的集合时,我们最好使用同步包装器(如果我错了,请纠正我),或者只在该集合上有调用时才同步代码。在某些情况下使用Vector是最好的选择吗?因为有很多程序使用Vector。从jre中删除Vector意味着它们都将被破坏。另一方面,根据您的需要使用ArrayList或其他捆绑列表实现。据我所知,使用Vector仅用于拥有依赖于它的核心API或1.2之前的运行时环境。这也可能是一件令人欣慰的事情。有些人喜欢向量,因为这是他们

当我们不需要同步时,ArrayList比Vector快。当我们确实需要一个同步的集合时,我们最好使用同步包装器(如果我错了,请纠正我),或者只在该集合上有调用时才同步代码。在某些情况下使用Vector是最好的选择吗?

因为有很多程序使用Vector。从jre中删除Vector意味着它们都将被破坏。另一方面,根据您的需要使用ArrayList或其他捆绑列表实现。

据我所知,使用Vector仅用于拥有依赖于它的核心API或1.2之前的运行时环境。这也可能是一件令人欣慰的事情。有些人喜欢向量,因为这是他们最初使用的


更新:Vector现在已被弃用,如前所述

虽然在新代码中使用
Vector
很少是一个好主意,但没有迫切需要弃用。虽然新的collections类具有优越性,但使用
Vector
类实际上并不会破坏任何东西

此外,还有一些依赖于
Vector
API的应用程序,毫无疑问,也有成千上万的客户和第三方应用程序使用它

基本上,弃用向量会造成不必要的破坏。即使稍微慢一点,也没有必要强迫人们更改工作可靠的代码



有人建议/暗示,他们可以在不(从未)实际移除向量的情况下,反对
Vector
。但问题是,弃用警告为真正的人创造了真正的工作。如果这是不必要的,忙碌的人将开始默认抑制警告。(回忆一下喊狼的男孩的故事……)

检查java中的锁省略,现代JVM实现(Mustang)足够智能,可以优化共享和非共享对象访问。


因此,它实际上并不重要(带有synchronized关键字的vector/arraylist);但去润滑会导致编译时出现太多警告:(

我可能错了,但我相信HotSpot JVM可以确定某个特定对象上是否需要同步,并在不需要时对其进行优化。例如,几年前,
StringBuilder
类作为
StringBuffer
(避免不必要的锁定造成的性能损失)。但是,HotSpot现在可以优化
StringBuffer
的同步(如果认为不必要),有效地使其速度与StringBuilder的速度相匹配。我想知道
Vector
是否也从这些优化中受益…@Michael:我从Steve Yegge的演讲中听到了这一点(在成绩单中搜索
StringBuffer
)。他链接到了一篇关于(Java 6中的偏向锁定)的文章[.@Adam Paynter:这是一个必须激活的优化(escape analysis)(-XX:+DoeScape analysis)。也许它是Java 7中的标准配置。无论如何,我不相信同步在大多数常用程序中会对性能产生多大影响。奇怪的是,我不会考虑“主题和争论”这个问题。这似乎是一件合理的事情。@Adam Paynter:同意,我实际上对讨论很感兴趣。这个问题对我来说似乎是客观的,并且提出了一个合理、具体的问题,我所在组织的人已经问过我很多次了。也许答案提供了主观的回答,但这不是问题的错呃…是的,显然删除它会造成混乱,但是@deprecated只会添加很多警告。无论如何,我不希望API中有任何更改,只是确认Vector是无用的,或者在某些情况下应该使用它。如果您“最初使用”Vector,那么要么你几乎从一开始就在使用Java,要么你是从非常古老的书籍/教程中学到的。我怀疑后者占了该类当前使用的90%。@Michael:有很多人(包括我自己)谁在1.0开始使用Java,尽管我希望大多数人都知道如何使用更新的集合类…