您的位置:首页 > 编程语言 > Java开发

【翻译】Java HashMap与Hashtable的区别

2016-08-12 14:52 501 查看

【翻译】Java HashMap与Hashtable的区别

原文地址Difference between HashMap and Hashtable in Java

如果你正在准备找一份初级Java程序员工作,你可能会遇到这样的面试问题。如果你理解,如:HashMap如何工作,等概念的话,这个问题对你来说就非常简单。下面我们来总结
HashMap
Hashtable
之间的区别。

1.
HashMap
Hashtable
之间的区别

1)
Hashtable
中定义的方法大部分都是同步的,而
HashMap
的方法不是同步的。如果我们想使
HashMap
变得线程安全,则需要使用
Collections.synchronizedMap(map)
ConcurrentHashMap
类型。
Hashtable
中的方法定义如下:

public synchronized int size() {...}
public synchronized boolean isEmpty() {...}
public synchronized Enumeration<K> keys() {...}
public synchronized boolean contains(Object value) {...}
public synchronized boolean containsKey(Object key) {...}


2)
Hashtable
不允许有空的键或值。
HashMap
允许有一个空值键(其他的空值键将简单地覆盖第一个空值键)
以及任意多的空值。

public static void main(String[] args) {
Hashtable<String,String> table = new Hashtable<String,String>();
table.put(null, null);
//OR
table.put("nullKey", null);
}


输出为:

Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:459)
at com.woodman.collection.DiffTableMap.main(DiffTableMap.java:10)


3)
Hashtable
是历史遗留下来的类,且并没有包含在最初的Java集合框架中(Java1.2以后包含)。HashMap从设计诞生起就包含在Java集合框架中。此外,
Hashtable
继承了
Dictionary
类,该类已经被Java废弃,并在新的JDK版本中用
Map
接口替代。

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {...}


public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {...}


4)
HashMap
中的
Iterator
是支持fail-fast,并会抛出
ConcurrentModificationException
。当一个线程正在利用
Iterator
对Map进行遍历时,而另一个线程通过
Iterator
自身之外的添加或删除方法改变
map
结构时,JVM会尽力抛出上述异常,但异常并不保证一定会抛出。
Hashtable
中枚举元素的方法不支持
fail-fast


public class DiffTableMap {
public static void main(String[] args) {
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put("key1", "value1");
hashMap.put("key2", "value2");
hashMap.put("key3", "value3");
hashMap.put("key4", "value4");
Iterator<String> iterator = hashMap.keySet().iterator();
while(iterator.hasNext()){
iterator.next();
iterator.remove();
System.out.println(hashMap);
}
}
}


输出结果:

{key2=value2, key3=value3, key4=value4}
{key3=value3, key4=value4}
{key4=value4}
{}


5) 最后,
Map
最大程度上消除了
Hashtable
在方法接口上的不足。
Hashtable
有一个名为
contains()
的方法,同时也提供了
containsValue()
containsKey()
方法。如果
Hashtable
中存在给定的值 ,
contains()
则返回
true
。但,从
contains()
的名字上理解,我们通常会期望存在指定值 的键时返回
true
,因为键是
Hashtable
访问数据首选机制。
Map
中通过仅保留了
containsValue()
containsKey()
方法,以消除歧义。

2. 在使用时如何选择
HashMap
Hashtable

在功能上,几乎没有
HashMap
(包括:
LinkedHashMap
ConcurrentHashMap
)做不了,但
Hashtable
可以做的。因此,在新的代码中,我们没有理由继续使用
Hashtable
。所以,强烈建议使用
HashMap
代替
Hashtable


此外,Hashtable在命名上,table的T没有大写,似乎也不满足“类型命名使用大驼峰”的命名规则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java hashtable hashmap
相关文章推荐