1.談談你對hashmap的理解
? ? hash對應數(shù)據(jù)結(jié)構(gòu)的哈希表铁瞒,哈希表是這樣的一個數(shù)據(jù)結(jié)構(gòu)蚪燕,提供常數(shù)級的增刪改查操作。
是一種用空間換時間的數(shù)據(jù)結(jié)構(gòu)
2. hashmap底層原理的實現(xiàn)
? 底層原理是數(shù)組構(gòu)成的哈希桶,通過計算元素的哈希值蜜另,算出元素在哈希數(shù)組里的索引碉纳,從而
快速定位元素
3.hashmap如何解決沖突的
?hashmap解決沖入的方法有多種勿负,常見的有鏈式地址法,通過數(shù)組+鏈表的方式
劳曹,二次哈希奴愉,碰撞后再進行一次哈希。開放地址法铁孵,在沖突后锭硼,按照一定的次序,從哈希表找到一個空閑的單元
4.hashmap是線程安全的嗎
?hashmap不是線程安全的蜕劝。
5.線程安全的hashmap
hashmap不是線程安全的檀头,多個線程并發(fā)修改哈希表時,有存在并發(fā)擴容的情況岖沛,此時容易造成死循環(huán)
線程安全的hashmap concurrent_map實現(xiàn)
對于jdk1.7來說暑始,concurrenthashmap的實現(xiàn)是分段鎖+hashentry+unsafe.
對于jdk1.8來說,實現(xiàn)則是synchronized+CAS+Node+Unsafe
put操作: 1.7:先定位segment,再定位桶,put全程加鎖榜聂,沒有獲得鎖的線程提前找到桶的位置,并自選64次獲取鎖嗤朴,超過則掛起
? ? ? ? ? ? ? ? 1.8 移除了segment鎖,直接定位到桶互躬,拿到first節(jié)點進行判斷播赁,為空則cas插入,為-1表示在擴容吼渡,跟著一起擴容容为,else則加鎖put
get操作,由于聲明為volatile,保證了修改的可見性坎背,不用加鎖
resize替劈,1.7 搬到單線程中執(zhí)行
? ? ? ? ? ? ?1.8 支持并發(fā)擴容。