HashMap和Hashtable之间的区别?
Java中的" HashMap"和" Hashtable"之间有什么区别?
对于非线程应用程序,哪个更有效?
解决方案
回答
根据此处的信息,我建议我们使用HashMap。我认为最大的好处是Java会阻止我们在对其进行迭代时对其进行修改,除非我们通过迭代器进行修改。
回答
Hashtable是同步的,而HashMap不是同步的。这使得Hashtable比Hashmap慢。
对于非线程应用程序,请使用HashMap,因为它们在功能方面是相同的。
回答
Hashtable与HashMap类似,并且具有相似的界面。建议我们使用" HashMap",除非需要对旧版应用程序的支持或者需要同步,因为" Hashtables"方法是同步的。因此,根据情况,因为我们不是多线程的,所以" HashMaps"是最佳选择。
回答
除了izb所说的之外,HashMap
允许空值,而Hashtable
不允许。
还要注意,Hashtable扩展了Dictionary类,正如Javadocs所声明的那样,该类已过时,并已由Map接口取代。
回答
对于线程化应用程序,我们通常可以根据性能要求放弃ConcurrentHashMap。
回答
Java中的" HashMap"和" Hashtable"之间有一些区别:
- Hashtable是同步的,而HashMap是不同步的。这使得" HashMap"更适合非线程应用程序,因为非同步对象通常比同步对象表现更好。
- "哈希表"不允许使用"空"键或者值。 " HashMap"允许一个" null"键和任意数量的" null"值。
- HashMap的子类之一是LinkedHashMap,因此,如果我们想要可预测的迭代顺序(默认为插入顺序),则可以轻松地将HashMap换成LinkedHashMap。如果我们使用的是"哈希表",这将不那么容易。
由于同步对我们来说不是问题,所以我建议使用" HashMap"。如果同步成为问题,我们也可以查看ConcurrentHashMap
。
回答
HashMap:Map接口的实现,该接口使用哈希码为数组建立索引。
哈希表:我们好,1998年打电话来。他们希望收回自己的收藏夹API。
严重的是,最好还是完全远离" Hashtable"。对于单线程应用程序,我们不需要额外的同步开销。对于高度并发的应用程序,偏执同步可能会导致饥饿,死锁或者不必要的垃圾收集暂停。就像Tim Howland指出的那样,我们可以改用ConcurrentHashMap
。
回答
注意,很多答案都说明Hashtable已同步。在实践中,这几乎买不到我们。同步在访问器/更改器方法上将停止同时从映射中添加或者删除两个线程,但是在现实世界中,我们经常需要进行额外的同步。
一个非常常见的习惯用法是"先检查然后放",即在地图中查找条目,然后添加(如果尚不存在)。无论我们使用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的任何事情都不能使用HashMap或者HashMap的派生完成,因此对于新代码,我看不出有任何理由回到Hashtable。