HashTable的應用很是普遍,HashMap是新框架中用來代替HashTable的類,也就是說建議使用HashMap,不要使用HashTable。可能你以爲HashTable很好用,爲何不用呢?這裏簡單分析他們的區別。java
HashTable的方法是同步 的,在方法的前面都有synchronized來同步,HashMap未經同步,因此在多線程場合要手動同步
HashMap這個區別就像Vector和ArrayList同樣。
能夠經過Map m = Collections.synchronizedMap(new HashMap(...));
對HashMap進行同步操做。數組
HashTable不容許null值(key和value都不能夠) ,HashMap容許null值(key和value均可以)。安全
HashTable有一個contains(Object value)功能和containsValue(Object value)功能同樣。多線程
HashTable使用Enumeration進行遍歷,HashMap使用Iterator進行遍歷。框架
HashTable的遍歷: Hashtable ht=new Hashtable(); ht.put("1", "111"); ht.put("3","333"); ht.put("2", "222"); Enumeration en=ht.keys(); while(en.hasMoreElements()){ Object key=en.nextElement(); Object value=ht.get(key); System.out.println("key="+key+",value="+value); }
HashMap的遍歷參考:http://blog.csdn.net/wl_ldy/archive/2010/10/13/5939552.aspx.net
以上只是表面的不一樣,它們的實現也有很大的不一樣。線程
HashTable中hash數組默認大小是11,增長的方式是 old*2+1。HashMap中hash數組的默認大小是16,並且必定是2的指數。code
哈希值的使用不一樣,HashTable直接使用對象的hashCode,代碼是這樣的:
```
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap從新計算hash值,並且用與代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);對象
static int hash(Object x) {blog
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
```
以上只是一些比較突出的區別。
public HashSet() { map = new HashMap<E,Object>(); }
調用HashSet的add方法時,其實是向HashMap中增長了一行(key-value對),該行的key就是向HashSet增長的那個對象,該行的value就是一個Object類型的常量。
private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; }
java.util.Properties 繼承自 java.util.Hashtable ,因此Properties是線程安全的。 Properties 類表示一個持久的屬性集.Properties 可保存在流中或從流中加載.屬性列表中每一個鍵及其對應值都是一個字符串.