Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
当前回答
对于线程应用程序,您通常可以使用ConcurrentHashMap,这取决于您的性能要求。
其他回答
Hashtable是同步的,而HashMap不是。另一个区别是HashMap中的迭代器是故障安全的而Hashtable的枚举器不是。如果您更改地图在迭代时,你会知道。HashMap允许其中包含空值,而Hashtable不允许。
除了这里已经提到的所有其他重要方面之外,CollectionsAPI(例如Map接口)一直在进行修改,以符合Java规范的“最新和最大”添加。
例如,比较Java 5 Map迭代:
for (Elem elem : map.keys()) {
elem.doSth();
}
与旧的Hashtable方法相比:
for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
Elem elem = (Elem) en.nextElement();
elem.doSth();
}
在Java 1.8中,我们还承诺能够像使用好的旧脚本语言一样构造和访问HashMaps:
Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];
更新:不,他们不会在1.8…:(
Project Coin的收藏增强功能是否将在JDK8中?
Java中HashMap和Hashtable之间有几个不同之处:
Hashtable是同步的,而HashMap不是。这使得HashMap更适合非线程应用程序,因为非同步对象通常比同步对象执行得更好。哈希表不允许空键或值。HashMap允许一个空键和任意数量的空值。HashMap的子类之一是LinkedHashMap,因此,如果您需要可预测的迭代顺序(默认情况下是插入顺序),您可以很容易地将HashMap替换为LinkedHashMap。如果您使用Hashtable,这将不会那么容易。
由于同步对您来说不是问题,所以我推荐HashMap。如果同步成为问题,您还可以查看ConcurrentHashMap。
对于线程应用程序,您通常可以使用ConcurrentHashMap,这取决于您的性能要求。
HashMap是一个用于以键和值格式存储元素的类。它不是线程安全的。因为它不同步。其中as Hashtable是同步的。Hashmap允许null,但hastable不允许null。