學習HashMap 源碼分析

之前面試被人問過HashMap和Hashtable的區別,回來找下資料,整理下:

Hashtable是個過時的集合類, 存在於Java API中很久了,在java4中被重寫了,實現了Map接口, 所以自此以後也成了Java集合框架中的一部分。


HashMap 和 Hashtable的區別:
HashMap和 Hashtable 都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。只要的區別有:線程安全性,同步(synchronization)以及速度。


1.HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap 可以接受爲null的鍵值(key)和value,而Hashtable則不行)。
2.HashMap 是非synchronized,而Hashtable是synchronized,這意味着 Hashtable是線程安全的。Java5 提供了ConcurrentHashMap,它是Hashtable的替代,比Hashtable的擴展性更好。
3.另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的,所以當有其他線程改變HashMap的結構(增加或者移除元素),將會拋出
ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一個一定發生的行爲,要看JVM。這條同樣也是
Enumeration和Iterator的區別。
4.由於Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢,如果你不需要同步,只需要單一線程,那麼HashMap性能要好。
5.HashMap不能保證隨着時間的推移Map中的元素次序是不變的。


結論
Hashtable和HashMap有幾個主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時候使用Hashtable,而如果你使用Java 5或以上的話,請使用ConcurrentHashMap吧。


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