Android小知識-如何正確的選擇HashMap士败、LinkedHashMap和ArrayMap

本平臺的文章更新會有延遲闯两,大家可以關(guān)注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程谅将,目前計劃在微信公眾號進行首發(fā)漾狼,如果大家想獲取最新教程,請關(guān)注微信公眾號饥臂,謝謝

在Android應(yīng)用開發(fā)中逊躁,HashMap使用最頻繁的容器之一,但它并不是最節(jié)約的容器隅熙,會占用大量內(nèi)存志衣。

HashMap是一個散列鏈表,向HashMap中put元素時猛们,先根據(jù)key的HashCode重新計算hash值,根據(jù)hash值得到這個元素在數(shù)組中的位置狞洋,如果該位置已經(jīng)存放了其他元素弯淘,那么在這個位置上的元素將以鏈表的形式存放,新加入的放鏈頭吉懊,最先加入的放鏈尾庐橙。如果該位置上沒有元素假勿,就直接將該元素放到此數(shù)組中指定的位置。

也就是說态鳖,向HashMap插入一個對象前转培,會給一個通向Hash陣列的索引,在索引的位置中浆竭,保存了這個Key對象的值浸须。

這意味著需要考慮的一個最大問題是沖突,也就是Hash沖突邦泄,當多個對象散列于陣列相同位置時删窒,就會有散列沖突的問題。因此顺囊,HashMap會配置一個大的數(shù)組來減少潛在的沖突肌索,并且會有其他的邏輯防止鏈接算法和一些沖突的發(fā)生。

從節(jié)省內(nèi)存的角度來看特碳,使用HashMap不是一個正確的選擇诚亚,為此Android提供了一個替代容器,也就是ArrayMap午乓。

ArrayMap提供了和HashMap一樣的功能站宗,但能避免過多的內(nèi)存開銷,方法是使用兩個小數(shù)組硅瞧,而不是一個大數(shù)組份乒。其中一個數(shù)組記錄對象Key Hash過后的順序列表,另一個數(shù)組按Key的順序記錄Key-Value值腕唧,根據(jù)Key數(shù)組的順序或辖,交織在一起。

在需要獲取某個Value時枣接,ArrayMap會計算輸入Key轉(zhuǎn)換過后的hash值颂暇,然后使用二分查找法對Hash數(shù)組尋找到對應(yīng)的index,然后可以通過這個index在另外一個數(shù)組中直接訪問需要的鍵值對但惶。如果在第二個數(shù)組鍵值對中的key和前面輸入的查詢key不一致耳鸯,就認為發(fā)生了碰撞沖突。為了解決這個問題膀曾,ArrayMap會以該key為中心點县爬,分別上下展開,逐個對比查找添谊,直到找到匹配的值财喳。

因此會帶來一個問題,就是隨著ArrayMap中對象數(shù)量的增加,需要訪問單獨對象的時間也會變長耳高。

在ArrayMap中執(zhí)行插入或者刪除操作時扎瓶,從性能角度上看,比HashMap還要更差一些泌枪,但如果只涉及很小的對象數(shù)概荷,比如1000以下,就不需要擔心這個問題碌燕。當值特別小時误证,相比HashMap,ArrayMap能節(jié)省更多的內(nèi)存陆蟆。

使用ArrayMap總結(jié)如下:

  • 當對象的數(shù)目非常欣壮А(1000以內(nèi)),但是訪問特別多叠殷,或者刪除和插入頻率不高時使用ArrayMap改鲫。

  • 當有映射容器,有映射時林束,并且所有映射的容器也是ArrayMap時使用ArrayMap像棘。

LinkedHashMap 直接繼承自HashMap ,這也就說明了 HashMap 一切重要的概念 LinkedHashMap 都是擁有的壶冒,這就包括了缕题,hash 算法定位 hash 桶位置,哈希表由數(shù)組和單鏈表構(gòu)成胖腾,并且當單鏈表長度超過 8 的時候轉(zhuǎn)化為紅黑樹烟零,擴容體系,這一切都跟 HashMap 一樣咸作。那么除了這么多關(guān)鍵的相同點以外锨阿,LinkedHashMap 比 HashMap 更加強大,這體現(xiàn)在:

LinkedHashMap 內(nèi)部維護了一個雙向鏈表记罚,解決了 HashMap 不能隨時保持遍歷順序和插入順序一致的問題

LinkedHashMap 元素的訪問順序也提供了相關(guān)支持墅诡,也就是我們常說的 LRU(最近最少使用)原則。

LinkedHashMap 擁有與 HashMap 相同的底層哈希表結(jié)構(gòu)桐智,即數(shù)組 + 單鏈表 + 紅黑樹末早,也擁有相同的擴容機制。相比 HashMap 的拉鏈式存儲結(jié)構(gòu)说庭,內(nèi)部額外通過 Entry 維護了一個雙向鏈表然磷。HashMap 元素的遍歷順序不一定與元素的插入順序相同,而 LinkedHashMap 則通過遍歷雙向鏈表來獲取元素刊驴,所以遍歷順序在一定條件下等于插入順序样屠。LinkedHashMap 可以通過構(gòu)造參數(shù)accessOrder 來指定雙向鏈表是否在元素被訪問后改變其在雙向鏈表中的位置。



掃碼_搜索聯(lián)合傳播樣式-標準色版.png

Android、Java痪欲、Python、Go攻礼、PHP业踢、IOS、C++礁扮、HTML等等技術(shù)文章知举,更有各種書籍推薦和程序員資訊,快來加入我們吧太伊!關(guān)注技術(shù)共享筆記雇锡。

838794-506ddad529df4cd4.webp.jpg

搜索微信“顧林海”公眾號僚焦,定期推送優(yōu)質(zhì)文章锰提。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芳悲,隨后出現(xiàn)的幾起案子立肘,更是在濱河造成了極大的恐慌,老刑警劉巖名扛,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅年,死亡現(xiàn)場離奇詭異,居然都是意外死亡肮韧,警方通過查閱死者的電腦和手機融蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄企,“玉大人超燃,你說我怎么就攤上這事∽兀” “怎么了淋纲?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長院究。 經(jīng)常有香客問我洽瞬,道長,這世上最難降的妖魔是什么业汰? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任伙窃,我火速辦了婚禮,結(jié)果婚禮上样漆,老公的妹妹穿的比我還像新娘为障。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布鳍怨。 她就那樣靜靜地躺著呻右,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞋喇。 梳的紋絲不亂的頭發(fā)上声滥,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音侦香,去河邊找鬼落塑。 笑死,一個胖子當著我的面吹牛罐韩,可吹牛的內(nèi)容都是我干的憾赁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼散吵,長吁一口氣:“原來是場噩夢啊……” “哼龙考!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起错蝴,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤洲愤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后顷锰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柬赐,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年官紫,在試婚紗的時候發(fā)現(xiàn)自己被綠了肛宋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡束世,死狀恐怖酝陈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毁涉,我是刑警寧澤沉帮,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贫堰,受9級特大地震影響穆壕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜其屏,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一喇勋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偎行,春花似錦川背、人聲如沸贰拿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膨更。三九已至,卻和暖如春缴允,著一層夾襖步出監(jiān)牢的瞬間询一,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工癌椿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菱阵。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓踢俄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晴及。 傳聞我的和親對象是個殘疾皇子都办,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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