開始學(xué)HashTable,HashMap和TreeMap的時(shí)候比較暈,覺得作用差不多,但是到實(shí)際運(yùn)用的時(shí)候又發(fā)現(xiàn)有許多差別的。需要大家注意,在實(shí)際開發(fā)中以需求而定。
java為數(shù)據(jù)結(jié)構(gòu)中的映射定義了一個(gè)接口java.util.Map,而HashMap Hashtable和TreeMap就是它的實(shí)現(xiàn)類。Map是將鍵映射到值的對象,一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射一個(gè)一個(gè)值。
Hashmap 是一個(gè)最常用的Map,它根據(jù)鍵的HashCode 值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.
Hashtable 與 HashMap類似,但是主要有6點(diǎn)不同。
1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動(dòng)同步HashMap這個(gè)區(qū)別就像Vector和ArrayList一樣。
2.HashTable不允許null值,key和value都不可以,HashMap允許null值,key和value都可以。HashMap允許key值只能由一個(gè)null值,因?yàn)閔ashmap如果key值相同,新的key, value將替代舊的。
3.HashTable有一個(gè)contains(Object value)功能和containsValue(Object value)功能一樣。
4.HashTable使用Enumeration,HashMap使用Iterator。
5.HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。
6.哈希值的使用不同,HashTable直接使用對象的hashCode。
TreeMap能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過序的。
下面是HashTable,HashMap和TreeMap總結(jié)的一個(gè)經(jīng)典例子。
package com.taobao.luxiaoting;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Hashtable;
import java.util.TreeMap;
class HashMaps
{
public static void main(String[] args)
{
Map map=new HashMap();
map.put(“a”, “aaa”);
map.put(“b”, “bbb”);
map.put(“c”, “ccc”);
map.put(“d”, “ddd”);
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(“map.get(key) is :”+map.get(key));
}
Hashtable tab=new Hashtable();
tab.put(“a”, “aaa”);
tab.put(“b”, “bbb”);
tab.put(“c”, “ccc”);
tab.put(“d”, “ddd”);
Iterator iterator_1 = tab.keySet().iterator();
while (iterator_1.hasNext()) {
Object key = iterator_1.next();
System.out.println(“tab.get(key) is :”+tab.get(key));
}
TreeMap tmp=new TreeMap();
tmp.put(“a”, “aaa”);
tmp.put(“b”, “bbb”);
tmp.put(“c”, “ccc”);
tmp.put(“d”, “ddd”);
Iterator iterator_2 = tmp.keySet().iterator();
while (iterator_2.hasNext()) {
Object key = iterator_2.next();
System.out.println(“tmp.get(key) is :”+tmp.get(key));
}
}
}
輸出結(jié)果如下圖所示