- 線程安全
HashMap線程不安全而HashTable線程安全
也可以通過以下代碼將hashMap轉化爲線程安全的實現:
HashMap test = new HashMap();
Map synchronizedMap = Collections.synchronizedMap(test);
2.效率
線程安全的hashTable效率較低,因爲每次 get和put操作都經過了synchronized關鍵字的加持。
3.是否接受null值
hashMap接受null值作爲key和value,hashMap不能接受null作爲key或者value,附上源碼:
hashMap:
這裏可以看到,如果hashMap的key==null將直接分配0作爲它的hash值
hashTable:
可以看到,如果key或者value==null,將直接觸發NullPointerException。
那麼,爲什麼要這麼實現呢?
網上有這樣的說法:
ConcurrentHashmap和Hashtable都是支持併發的,這樣會有一個問題,當你通過get(k)獲取對應的value時,如果獲取到的是null時,你無法判斷,它是put(k,v)的時候value爲null,還是這個key從來沒有做過映射。HashMap是非併發的,可以通過contains(key)來做這個判斷。而支持併發的Map在調用m.contains(key)和m.get(key),m可能已經不同了。
但是我感覺還是不對,沒有回答key爲什麼不能爲null的問題。這個後面繼續思考。