java複習之HashMap和Hashtable的區別
1.兩者繼承結構不同
雖然都實現了Map、Cloneable、Serializable三個介面。但是HashMap繼承自抽象類AbstractMap,而HashTable繼承自抽象類Dictionary。其中Dictionary類是一個已經被廢棄的類,這一點我們可以從它程式碼的註釋中看到:
以下程式碼及註釋來自java.util.Dictionary
* <strong>NOTE: This class is obsolete. New implementations should
* implement the Map interface, rather than extending this class.</strong>
*
2.HashMap支援空的鍵值 而HashTable在遇到null時,會丟擲NullPointerException異常
這並不是因為HashTable有什麼特殊的實現層面的原因導致不能支援null鍵和null值,這僅僅是因為HashMap在實現時對null做了特殊處理,將null的hashCode值定為了0,從而將其存放在雜湊表的第0個bucket中。我們一put方法為例,看一看程式碼的細節:
以下程式碼及註釋來自java.util.HashTable
public synchronized V put(K key, V value) {
// 如果value為null,丟擲NullPointerException
if (value == null) {
throw new NullPointerException();
}
// 如果key為null,在呼叫key.hashCode()時丟擲NullPointerException
// ...
}
以下程式碼及註釋來自java.util.HasMap
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
// 當key為null時,呼叫putForNullKey特殊處理
if (key == null)
return putForNullKey(value);
// ...
}
private V putForNullKey(V value) {
// key為null時,放到table[0]也就是第0個bucket中
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
3.執行緒安全
我們說HashTable是同步的,HashMap不是,也就是說HashTable在多執行緒使用的情況下,不需要做額外的同步,而HashMap則不行。那麼HashTable是怎麼做到的呢?
以下程式碼及註釋來自java.util.HashTable
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
}
public Set<K> keySet() {
if (keySet == null)
keySet = Collections.synchronizedSet(new KeySet(), this);
return keySet;
}
可以看到,也比較簡單,就是公開的方法比如get都使用了synchronized描述符。而遍歷檢視比如keySet都使用了Collections.synchronizedXXX進行了同步包裝。
相關文章
- HashMap、HashTable、ConcurrentHashMap的區別HashMap
- C#中Hashtable和HashMap的區別C#HashMap
- HashMap、Hashtable、ConcurrentHashMap的原理與區別HashMap
- 集合類HashMap,HashTable,ConcurrentHashMap區別?HashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- java複習之 Vector、ArrayList和LinkedList 的區別Java
- Hashtable和HashMapHashMap
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及區別JavaHashMap
- HashTable、ConcurrentHashMap、TreeMap、HashMap關於鍵值的區別HashMap
- 【java】【Map】HashMap、Hashtable、CollectionsJavaHashMap
- 10分鐘掌握ConcurrentHashMap 3分鐘清楚和HashMap、Hashtable的區別HashMap
- 五分鐘看懂Hashtable原始碼以及與HashMap的區別原始碼HashMap
- Java集合詳解4:一文讀懂HashMap和HashTable的區別以及常見面試題JavaHashMap面試題
- HashTable與ConcurrentHashMap的區別HashMap
- Java中HashMap,LinkedHashMap,TreeMap的區別[轉]JavaHashMap
- Java 容器學習之 HashMapJavaHashMap
- Java之InetSocketAddress和SocketAddress的區別Java
- Java之.class和.getClass()的區別Java
- Java之for(;;)和while(true)的區別JavaWhile
- 三,TreeMap和HashMap,TreeSet和HashMap的區別以及方法使用上的不同HashMap
- 一文讀懂JDK7,8,9的hashmap,hashtable,concurrenthashmap及他們的區別JDKHashMap
- HashMap、LinkedHashMap、HashTable、HashSet筆記HashMap筆記
- HashSet與HashMap的區別HashMap
- Java之try-catch和throws的區別Java
- Python學習之Pandas和Numpy的區別!Python
- python深複製和淺複製的區別Python
- Java集合之Hashtable原始碼解析Java原始碼
- java基礎型別原始碼解析之HashMapJava型別原始碼HashMap
- Python學習系列之 xrange和range的區別!Python
- Hashtable/HashMap與key/value為null的關係HashMapNull
- 一文讀懂JDK1.7,JDK1.8,JDK1.9的hashmap,hashtable,concurrenthashmap及他們的區別JDKHashMap
- 【Java】equals 和 == 的區別Java
- Java集合之HashMapJavaHashMap
- js 淺複製和深複製的區別和應用JS
- JAVA之編譯期和執行期區別Java編譯
- 【原創】HashMap複習精講HashMap
- java yield()和sleep()的區別Java
- java 中equals和==的區別Java