HashMap與HashTable的區別

  1. 線程安全

              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的問題。這個後面繼續思考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章