我的習慣,首先了解它,咱們先來看看什麼是HashMap和HasheTalbehtml
哈希表(hash table)也叫散列表,是一種很是重要的數據結構,應用場景及其豐富,許多緩存技術(好比memcached)的核心其實就是在內存中維護一張大的哈希表,而HashMap的實現原理也經常出如今各種的面試題中,重要性可見一斑。面試
簡單來講,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,若是定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操做很快,僅需一次尋址便可;若是定位到的數組包含鏈表,對於添加操做,其時間複雜度爲O(n),首先遍歷鏈表,存在即覆蓋,不然新增;對於查找操做來說,仍需遍歷鏈表,而後經過key對象的equals方法逐一比對查找。因此,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。數組
類比於HashTable,而HashTalbe是線程安全的,效率較低的Hash數組。緩存
下面,咱們來具體看看兩者:安全
1、HashMap與HashTable的區別:數據結構
1.HashMap是非線程安全的,HashTable是線程安全的,HashTable中的不少方法都是加了sysnchronized關鍵字的,確保了方法的同步;多線程
2.HashMap能夠接受空key和value,而HashTable不能接受空key和value;異步
3.因爲HashMap是異步執行,而HashTable是同步執行,因此在單線程環境下,HashMap的速度高於HashTable;memcached
4.HashMap的迭代器採用的是Iterator,Iterator是快速失敗(Fail-Fast),在遍歷過程當中如有其餘線程對該HashMap進行增長或者刪除元素,則會拋出ConcurrentModificationException,由於快速失敗的迭代器是操做的集合自己,性能
HashTable的迭代器是Enumeration,Enumeration是安全失敗(Fail-Safe),在遍歷過程當中如有其餘線程對該集合進行增長或則刪除元素,不會拋出ConcurentModificationException,由於安全失敗的迭代器操做的是原集合的一個拷貝。
2、HashTable和ConcurrentHashMap的區別:
在進行迭代時,HashTable會鎖住整個Map,而ConcurrentHashMap只鎖住Map的一部分,因此ConcurrentHashMap在多線程環境下的性能更好。
3、如何使用HashMap和HasheTalbe呢? 例如:
我想線程安全可是我又想效率高?
複製代碼
能夠經過把整個Map分爲N個Segment(相似HashTable),能夠提供相同的線程安全,可是效率提高N倍,默認提高16倍。
如何讓HashMap實現同步功能?
複製代碼
使用Map m = Collections.synchronizeMap(hashMap);
參考博文地址:1.blog.csdn.net/agallochmin… 2.www.cnblogs.com/chengxiao/p…