HashMap相關(guān)

hashCode.png

hash概念

hash:是一種信息摘要算法泵琳,它還叫做哈希,或者散列舔涎。我們平時(shí)使用的MD5中的公私鑰驗(yàn)證都屬于Hash算法笼踩,通過輸入key進(jìn)行Hash計(jì)算,就可以獲取key的HashCode()亡嫌,比如我們通過校驗(yàn)MD5來驗(yàn)證文件的完整性嚎于。

碰撞:好的Hash算法可以計(jì)算出幾乎獨(dú)一無二的hashCode,如果hashCode出現(xiàn)了重復(fù)的挟冠,就稱作碰撞于购。

hashCode

  • hashCode是object對象方法,一般對象都會(huì)重寫該方法圃郊;
  • hashMap允許key為null价涝,但是只能存在一個(gè)null的key;
  • hashMap什么時(shí)候會(huì)用到equals方法持舆?

HashMap存儲(chǔ)過程

HashMap是將數(shù)組和鏈表結(jié)合的一種結(jié)構(gòu)色瘩,比較形象如下圖:


HashMap.png

首先進(jìn)行put操作時(shí),會(huì)先計(jì)算出該key的hash值逸寓,然后調(diào)用HashMap的hash方法居兆,該方法在JDK 8中如下:

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

主要思想是將key的高16位和低16進(jìn)行與或操作,然后再通過下面與操作竹伸,計(jì)算出數(shù)key在數(shù)組中的索引位置泥栖,算法的目的主要是為了讓數(shù)據(jù)盡可能的分布均勻:

 h & (length-1)

后面再根據(jù)數(shù)組對應(yīng)索引中是否有數(shù)據(jù)然后進(jìn)行數(shù)據(jù)的添加簇宽,這其中判斷key是否重復(fù)的依據(jù)是有key的equals方法來進(jìn)行的,如果equals方法相同吧享,則認(rèn)為key重復(fù)魏割,只會(huì)對value進(jìn)行更新。

HashMap擴(kuò)容

隨著不斷往HashMap存放數(shù)據(jù)钢颂,需要進(jìn)行擴(kuò)容操作钞它,代碼中主要通過如下:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

static final float DEFAULT_LOAD_FACTOR = 0.75f;

默認(rèn)數(shù)組大小16,當(dāng)超過16 * 0.75時(shí)會(huì)進(jìn)行resize擴(kuò)容操作殊鞭,這個(gè)過程會(huì)重寫進(jìn)行hash計(jì)算遭垛,性能消耗比較大,因此選擇一個(gè)好的初始容量非常重要操灿。

HashMap遍歷

    Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
      Map.Entry entry = (Map.Entry) iter.next();
      Object key = entry.getKey();
      Object val = entry.getValue();
  }

HashTable和HashMap

  1. Hashtable線程安全锯仪,HashMap線程安全;
  2. 建議使用ConcurrentHashMap趾盐;

JDK8中HashMap的新特性

如果某個(gè)桶中的鏈表記錄過大的話(當(dāng)前是TREEIFY_THRESHOLD = 8)庶喜,就會(huì)把這個(gè)鏈動(dòng)態(tài)變成紅黑二叉樹,使查詢最差復(fù)雜度由O(N)變成了O(logN)谤碳。

for (int binCount = 0; ; ++binCount) {
    if ((e = p.next) == null) {
        p.next = newNode(hash, key, value, null);
        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
            treeifyBin(tab, hash);
        break;
    }
    if (e.hash == hash &&
        ((k = e.key) == key || (key != null && key.equals(k))))
        break;
    p = e;
}

Set List Map

Collection
----set
--------ArrayList / LinkedList / Vector
----List
--------HashSet / TreeSet

Map
----HashMap
--------LinkedHashMap
----HashTable
----TreeMap

其他問題

  • 在Android中使用SparseArray代替HashMap
  • Android中LruCache實(shí)現(xiàn)原理就是通過LinkedHashMap來實(shí)現(xiàn)的
  • LinkedHashMap原理是將HashMap和雙向鏈表進(jìn)行結(jié)合來實(shí)現(xiàn)的

參考文章

  1. https://blog.csdn.net/justloveyou_/article/details/62893086
  2. http://www.importnew.com/21294.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溃卡,一起剝皮案震驚了整個(gè)濱河市溢豆,隨后出現(xiàn)的幾起案子蜒简,更是在濱河造成了極大的恐慌,老刑警劉巖漩仙,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓茬,死亡現(xiàn)場離奇詭異,居然都是意外死亡队他,警方通過查閱死者的電腦和手機(jī)卷仑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麸折,“玉大人锡凝,你說我怎么就攤上這事」柑洌” “怎么了窜锯?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芭析。 經(jīng)常有香客問我锚扎,道長,這世上最難降的妖魔是什么馁启? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任驾孔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翠勉。我一直安慰自己妖啥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布对碌。 她就那樣靜靜地躺著迹栓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俭缓。 梳的紋絲不亂的頭發(fā)上克伊,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音华坦,去河邊找鬼愿吹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惜姐,可吹牛的內(nèi)容都是我干的犁跪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹袁,長吁一口氣:“原來是場噩夢啊……” “哼坷衍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起条舔,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤枫耳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孟抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迁杨,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年凄硼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铅协。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摊沉,死狀恐怖狐史,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情说墨,我是刑警寧澤骏全,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站婉刀,受9級特大地震影響吟温,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜突颊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一鲁豪、第九天 我趴在偏房一處隱蔽的房頂上張望潘悼。 院中可真熱鬧,春花似錦爬橡、人聲如沸治唤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾添。三九已至,卻和暖如春柜裸,著一層夾襖步出監(jiān)牢的瞬間缕陕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工疙挺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛邑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓铐然,卻偏偏與公主長得像蔬崩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子搀暑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Q:HashMap 的數(shù)據(jù)結(jié)構(gòu)沥阳?A:哈希表結(jié)構(gòu)(鏈表散列:數(shù)組+鏈表)實(shí)現(xiàn),結(jié)合數(shù)組和鏈表的優(yōu)點(diǎn)自点。當(dāng)鏈表長度超過 ...
    TinyDolphin閱讀 24,020評論 13 50
  • 摘要 HashMap是Java程序員使用頻率最高的用于映射(鍵值對)處理的數(shù)據(jù)類型桐罕。隨著JDK(Java Deve...
    周二倩你一生閱讀 1,250評論 0 5
  • 今天晚上我在家里洗了個(gè)澡,出來我先穿上棉綢大褲衩坐在床上樟氢,拿起遙控冈绊,打開電視,我搜了個(gè)動(dòng)物埠啃,我要看看里面有好看的東...
    11號小溪流連星皓閱讀 333評論 0 0
  • 1沒事兒就想 話說小蓋碗和小胖丫住在了同一個(gè)屋檐下,抬頭不見低頭見伟恶,生活之中勢必有些摩擦碴开,至于是否有火花有感覺,那...
    秭歸秀才9條命兒閱讀 220評論 0 0
  • 已過12點(diǎn)博秫。是12月26號了潦牛。 無論如何,孤單不需理由挡育,與諸君共勉巴碗。 沉霾掩疴,枝搖葉落即寒。 瞧著堅(jiān)固的關(guān)系瞬間瓦解...
    有個(gè)愛吾淺藍(lán)閱讀 256評論 0 0