【翻译】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没有大写,似乎也不满足“类型命名使用大驼峰”的命名规则。
相关文章推荐
- HashMap和Hashtable的区别 2013/11/12 | 分类: 基础技术 | 5 条评论 | 标签: 基础技术 分享到: 128 本文由 ImportNew - 唐小娟 翻译自 Javar
- HashMap和Hashtable的区别 2013/11/12 | 分类: 基础技术 | 5 条评论 | 标签: 基础技术 分享到: 157 本文由 ImportNew - 唐小娟 翻译自 Javar
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的使用与区别
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别
- java中Hashtable与HashMap的区别
- java中hashmap和hashtable的区别
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 - [Java|技术相关]
- Java中hashmap和hashtable的区别
- Java中hashmap和hashtable的区别
- java中hashmap和hashtable的区别
- Java容器类List、ArrayList、Vector的区别及Map、HashTable、HashMap的区别
- Java知识点Vector和ArrayList,Hashtable和HashMap,ArrayList和LinkedList的区别
- java里的Hashtable和HashMap有什么区别
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap区别
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法
- [转]Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别.
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法