在Java中使用Hashtable,Vector或HashMap或ArrayList

Ber*_*own 13 java vector

一个在Java开发中受到压力的模因总是在Vector上使用ArrayList.Vector已弃用.这可能是真的,但Vector和Hashtable具有同步的优势.

我正在使用面向大量并发的应用程序,使用像Vector这样的同步对象会不会有好处?看来他们有自己的位置?

fal*_*tro 17

Vector和Hashtable的问题在于它们只是本地同步的.它们不会在并发应用程序中中断(如在损坏的数据中),但是,由于本地同步(例如,get是同步的,但只是在返回之前),您将希望无论如何都要执行自己的同步作为对内容的迭代.现在,即使你的put方法需要一些额外的同步来配合迭代同步,你最终会遇到Hashtable/Vector被双重同步的情况.


Pet*_*aný 17

ConcurrentHashMap的方式更快比Hashtable的.它是并发的,而不仅仅是同步的.它一次承认多个读者/作者.

但是没有这样的'并发'数组列表.根据您的需要,CopyOnWriteArrayList可能是您需要的,也可能不是.


Pau*_*lin 13

如果需要同步ArrayList或HashMap,可以将它们包装起来.

List list = Collections.synchronizedList(new ArrayList(...));
Map m = Collections.synchronizedMap(new HashMap(...));
Run Code Online (Sandbox Code Playgroud)

我个人认为这些集合中的"synchronized"方法在繁重的线程代码中并不是很有用.有一些较新的集合可以帮助更多,但主要是我发现自己创建自己的同步对象并围绕它们进行同步,或者使用java.util.concurrent中的新锁


Joa*_*uer 8

同步有它的位置,但这不是Vector和之间的唯一区别ArrayList.Vector每次超过其容量时,将其内部存储阵列增加固定量,同时ArrayList按固定因子增长,这通常是一种更好的方法(因为它为附加项目提供了O(1)的摊销成本).

另请注意,Collections.synchronizedList()可以用于在任何List实现上创建同步视图,因此您不必绑定特性Vector(LinkedList例如,您可能需要同步).

  • 不完全的.如果未在Vector上设置capacityIncrement,则在需要额外容量时,默认情况下会将其大小加倍. (2认同)