a之间有什么区别? HashMap
和a Hashtable
在Java?
哪个非线程应用程序更有效?
两者之间存在一些差异 HashMap
和 Hashtable
在Java中:
Hashtable
是 同步,而 HashMap
不是。这使得 HashMap
对于非线程应用程序更好,因为非同步对象通常比同步对象执行得更好。
Hashtable
不允许 null
键或值。 HashMap
允许一个 null
钥匙和任意数量的 null
值。
HashMap的子类之一是 LinkedHashMap
,所以如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地换出 HashMap
为一个 LinkedHashMap
。如果你使用的话,这并不容易 Hashtable
。
由于同步对您来说不是问题,我建议 HashMap
。如果同步成为问题,您也可以查看 ConcurrentHashMap
。
请注意,许多答案表明Hashtable已同步。 在实践中,这很少给你买。 访问器/ mutator方法上的同步将阻止两个线程同时添加或从地图中删除,但在现实世界中,您经常需要额外的同步。
一个非常常见的习语是“检查然后放” - 即在地图中查找条目,如果它尚不存在则添加它。无论您使用Hashtable还是HashMap,这都不是原子操作。
可以通过以下方式获得等效同步的HashMap:
Collections.synchronizedMap(myMap);
但要正确实现这个逻辑,你需要 额外的同步 形式:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
即使迭代Hashtable的条目(或Collections.synchronizedMap获得的HashMap)也不是线程安全的,除非您还通过其他同步保护Map不被修改。
实施 ConcurrentMap 界面(例如 的ConcurrentHashMap通过包括解决一些这个问题 线程安全检查然后行为语义 如:
ConcurrentMap.putIfAbsent(key, value);
Hashtable
被认为是遗留代码。什么都没有 Hashtable
无法使用 HashMap
的推导 HashMap
,所以对于新代码,我认为没有任何理由回到 Hashtable
。
在访谈中经常会询问这个问题,以检查候选人是否理解收集类的正确用法,并了解可用的替代解决方案。
关于一些重要条款的说明
HashMap可以同步
Map m = Collections.synchronizeMap(hashMap);
Map提供了Collection视图,而不是直接支持迭代 通过枚举对象。集合视图大大增强了 界面的表现力,如本节后面所述。 Map允许您迭代键,值或键值对; Hashtable不提供第三种选择。 Map提供了一种安全的方式 删除迭代中的条目; Hashtable没有。 最后,Map修复了Hashtable界面中的一个小缺陷。 Hashtable有一个名为contains的方法,如果是,则返回true Hashtable包含给定值。鉴于它的名字,你会期待这一点 如果Hashtable包含给定键,则返回true的方法,因为 关键是Hashtable的主要访问机制。地图 接口通过重命名方法消除了这种混淆的来源 中的containsValue。此外,这提高了界面的一致性 - containsValue parallels containsKey。
HashMap
:一个实现 Map
使用哈希码索引数组的接口。
Hashtable
:嗨,1998年叫。他们想要回收他们的集合API。
说真的,你最好远离 Hashtable
共。对于单线程应用程序,您不需要额外的同步开销。对于高度并发的应用程序,偏执同步可能会导致饥饿,死锁或不必要的垃圾收集暂停。就像Tim Howland指出的那样,你可以使用 ConcurrentHashMap
代替。
请记住 HashTable
是Java集合框架(JCF)引入之前的遗留类,后来被改进以实现 Map
接口。那是 Vector
和 Stack
。
因此,在新代码中始终远离它们,因为JCF中总是有更好的替代方案 正如其他人指出的那样。
这里是 Java集合备忘单 你会发现有用的。请注意,灰色块包含遗留类HashTable,Vector和Stack。
除了izb所说的, HashMap
允许空值,而 Hashtable
才不是。
另请注意 Hashtable
扩展了 Dictionary
上课,作为 的Javadoc 国家,已经过时,已被取代 Map
接口。
看看这张图表。它提供了不同数据结构与HashMap和Hashtable之间的比较。比较准确,清晰,易于理解。