hashmap解析

1.hashmap
1)hashmap用過么,說說具體用途
答:用過,在平常工作中經(jīng)常用到hashmap這種數(shù)據(jù)結(jié)構(gòu),hashmap是基于 map接口實現(xiàn)的一種鍵值對<key,value>的存儲結(jié)構(gòu),允許null值,同時非有序,非同步(即線程不安全)hashmap底層實現(xiàn)是數(shù)組+鏈表+紅黑樹(jdk1.8增加了紅黑樹部分。)它存儲和查找數(shù)據(jù)時,是根據(jù)鍵key的hashcode的值計算出具體的存儲位置,hashmap最多只允許一條記錄的鍵key為null,hashmap增刪改查等常規(guī)操作都有不錯的執(zhí)行效率,是arraylist和linkedlist等數(shù)據(jù)結(jié)構(gòu)的一種折中實現(xiàn)。

2.說說hashmap常用操作的底層實現(xiàn)原理?如存儲put(key,v value),查找get(object key),刪除(object key ),修改replace(key,v value)等操作
答:調(diào)用put(K key,V value)操作添加一個key-value鍵值對時,進(jìn)行了如下操作:判斷哈希表Node<K,V>[]table是否為空或者為null,是則執(zhí)行resize()方法進(jìn)行擴容。
根據(jù)插入的key的hash值,通過(n-1)&hash當(dāng)前元素的hash值&hash表長度-1(實際就是hash值%hash表長度)計算出存儲位置table[i]。如果存儲位置沒有元素存放,則將新增節(jié)點存儲在此位置table[i]。
如果存儲位置已經(jīng)有鍵值對元素存在,則判斷該位置元素的hash值和key值是否和當(dāng)前操作元素一致,一致則證明是修改value操作,覆蓋value即可。
當(dāng)前存儲位置即有元素,又不和當(dāng)前操作元素一致,則證明此處位置table[i]已經(jīng)發(fā)生了hash沖突,則通過判斷頭節(jié)點是否是treeNode,如果是treeNode則證明此位置的結(jié)構(gòu)是紅黑樹,以紅黑樹的方式新增節(jié)點。
如果不是紅黑樹,則證明是單鏈表,將新增結(jié)點插入至鏈表的最后位置,隨后判斷當(dāng)前鏈表長度是否大于等于8,是則當(dāng)前存儲位置的鏈表轉(zhuǎn)化為紅黑樹。遍歷過程中如果發(fā)現(xiàn)key已經(jīng)存在,則直接覆蓋value。
插入成功后,判斷當(dāng)前存儲鍵值對的數(shù)量大于閾值threshold是則擴容。

調(diào)用get(Object key)操作根據(jù)鍵key查找對應(yīng)的key-value鍵值對時,進(jìn)行了如下操作:
先調(diào)用hash(key)方法計算出key的hash值
根據(jù)查找的鍵值key的hash值,通過(n-1)&hash當(dāng)前元素的hash值&hash表長度-1(實際就是hash值%hash表長度)計算出存儲位置table[i],判斷存儲位置是否有元素存在。
如果存儲位置有元素存放,則首先比較頭結(jié)點元素,如果頭結(jié)點的key的hash值和要獲取的key的hash值相等,并且頭結(jié)點的key本身和要獲取的key相等,則返回該位置的頭結(jié)點。
如果存儲位置沒有元素存放,則返回null。
如果存儲位置有元素存放,但是頭結(jié)點元素不是要查找的元素,則需要便利該位置進(jìn)行查找。
先判斷頭結(jié)點是否是treeNode,如果是treeNode則證明此位置的結(jié)構(gòu)是紅黑樹,以紅黑樹的方式遍歷查找該結(jié)點,沒有則返回null。
如果不是紅黑樹,則證明是單鏈表。遍歷單鏈表,逐一比較鏈表結(jié)點,鏈表結(jié)點的key的hash值和要獲取的key的hash值相等,并且鏈表結(jié)點的key本身和要獲取的key相等,則返回該結(jié)點,遍歷結(jié)束仍未找到對應(yīng)的key的結(jié)點,則返回null。

調(diào)用remove(Obkect key)的操作根據(jù)key刪除對應(yīng)的key-value鍵值對時,進(jìn)行了如下操作:
先調(diào)用hash(key)方法計算出key的hash值
根據(jù)查找的鍵值key的hash值,通過(n-1)&hash當(dāng)前元素的hash值&hash表長度-1(實際就是hash值%hash表長度)計算出存儲位置table[i],判斷存儲位置是否有元素存在。
如果存儲位置有元素存放,則首先比較頭結(jié)點元素,如果頭結(jié)點的key的hash值和要獲取的key的hash值相等,并且頭結(jié)點的key本身和要獲取的key相等,則該位置的頭結(jié)點即為要刪除的結(jié)點,記錄此結(jié)點至變量node中。
如果存儲位置沒有元素存放,則沒有找到對應(yīng)要刪除的結(jié)點,則返回null。
如果存儲位置有元素存放,但是頭結(jié)點元素不是要刪除的元素,則需要遍歷該位置進(jìn)行查找。
先判斷頭結(jié)點是否是treeNode,如果時treeNode則證明此位置的結(jié)構(gòu)是紅黑樹,以紅黑樹的方式遍歷查找并刪除該結(jié)點,沒有則返回null。
如果不是紅黑樹,則證明是單鏈表。遍歷單鏈表,逐一比較鏈表結(jié)點,鏈表結(jié)點的key和hash值和要獲取的key的hash值相等,并且鏈表結(jié)點的key本身和要獲取的key相等,則此為要刪除的結(jié)點,記錄此結(jié)點至變量node中,遍歷結(jié)束仍未找到對應(yīng)key的結(jié)點,則返回null。如果找到要刪除的結(jié)點node,則判斷是否需要比較value也是否一致,如果value值一致或者不需要比較value值,則執(zhí)行刪除結(jié)點操作,刪除操作根據(jù)不同的情況與結(jié)構(gòu)進(jìn)行不同的處理。
如果當(dāng)前結(jié)點是樹結(jié)點,則證明當(dāng)前位置的鏈表已變成紅黑樹結(jié)構(gòu),通過紅黑樹結(jié)點的方式刪除對應(yīng)結(jié)點。
如果不是紅黑樹,則證明是單鏈表。如果要刪除的是頭結(jié)點,則當(dāng)前存儲位置table[i]的頭結(jié)點指向刪除結(jié)點的下一個結(jié)點。
如果要刪除的結(jié)點不是頭結(jié)點,則將要刪除的結(jié)點的后繼結(jié)點node.next賦值給要刪除結(jié)點的前驅(qū)結(jié)點的next域,即p.next=node.next;。

調(diào)用replace(K key,V value)操作根據(jù)鍵key查找對應(yīng)的key-value鍵值對,隨后替換對應(yīng)的值value,進(jìn)行了如下操作:
先調(diào)用hash(key)方法計算出key的hash值 隨后調(diào)用getNode方法獲取對應(yīng)key所映射的value值。記錄元素舊值,將新值賦值給元素,返回元素舊值,如果沒有找到元素,則返回null。

hash沖突(hash碰撞)是什么?為什么會出現(xiàn)這種現(xiàn)象?如何解決hash沖突?
答:hash沖突:當(dāng)我們調(diào)用put(K key,V value)的、操作添加key-value鍵值對,這個key-value鍵值對存放在的位置是通過擾動函數(shù)(key==null)?0:(h=key.hashCode())^(h>>>16)計算鍵key的hash值,隨后將這個hash值%模上哈希表Node<K,V>[ ]table的長度得到具體的存放位置。所以put(K key,V value)多個元素,是有可能計算出相同的存放位置。此現(xiàn)象就是hash沖突或者h(yuǎn)ash碰撞。
hash沖突解決:開發(fā)定址法 ,在散列法,鏈地址法,公共溢出區(qū)法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 HashMap的底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,但是數(shù)組中存放的并不是一個對象而是鏈表。所以也可以成HashMap的...
    史云龍閱讀 471評論 0 0
  • HashMap簡介 HashMap 主要用來存放鍵值對,它基于哈希表的Map接口實現(xiàn) ,是常用的Java集合之一。...
    蘇若墨閱讀 346評論 0 0
  • 前言 上篇文章講解了JDK1.7中的HashMap源碼, 主要采用數(shù)組+鏈表來實現(xiàn), 根據(jù)元素的hash計算出來的...
    海之韻Baby閱讀 444評論 0 0
  • 關(guān)注微信公眾號:程序猿的日常分享,定期更新分享。 HashMap是我們?nèi)粘9ぷ髦惺褂梅浅6嗟娜萜?,由于HashMa...
    wangpeng123閱讀 334評論 0 0
  • 來源聲明:本文是整理微信公眾號[程序員小灰]的漫畫系列文章 什么是HashMap HashMap是一個用于存儲Ke...
    Aisen閱讀 846評論 0 0

友情鏈接更多精彩內(nèi)容