1. 程式人生 > >hashmap初試陣列大小為什麼一定要是2 的倍數

hashmap初試陣列大小為什麼一定要是2 的倍數

1、在hashmap 的底層原始碼中,首先會計算一個 key 的 hash 碼,比如計算一個字串 "1".hashcode(); 會得到 hashcode 的大小為 49,但是 hashmap 預設陣列的大小是 16,所以這樣肯定是不能存到數組裡面的,會越界

2、需要再次通過一個 hash 函式(這個hash 函式是自己定義的)來得到一個 hash 值,在 hashmap 的底層,這個 hash 函式是用 hashcode 的低 16 位與 高16 位進行的一次異或運算如下:


為什麼要進行這一步的運算呢?看下面:

這就是HashMap的高明之處。先看個例子,一個十進位制數32768(二進位制1000 0000 0000 0000),經過上述公式運算之後的結果是35080(二進位制1000 1001 0000 1000)。看出來了嗎?或許這樣還看不出什麼,再舉個數字61440(二進位制1111 0000 0000 0000),運算結果是65263(二進位制1111 1110 1110 1111),現在應該很明顯了,它的目的是讓“1”變的均勻一點,雜湊的本意就是要儘量均勻分佈

。那這樣有什麼意義呢?看第3步。    3、 得到h之後,把h與HashMap的承載量(HashMap的預設承載量length是16,可以自動變長。在構造HashMap的時候也可以指定一個長 度。這個承載量就是上圖所描述的陣列的長度。)進行邏輯與運算,即 h & (length-1),這樣得到的結果就是一個比length小的正數,我們把這個值叫做index。其實這個index就是索引將要插入的值在陣列中的 位置。第2步那個演算法的意義就是希望能夠得出均勻的index,這是HashTable的改進,HashTable中的演算法只是把key的 hashcode與length相除取餘,即hash % length,這樣有可能會造成index分佈不均勻。還有一點需要說明,HashMap的鍵可以為null,它的值是放在陣列的第一個位置。

3、得到 hash 值之後,再與陣列的長度-1(length-1)進行一次與運算,因為如果陣列的長度是 2 的倍數,那麼length-1 的二進位制一定是 ...00001111...這種形式,也就是前面一定都是 0,後面全是1,那麼再與 hash 值進行與運算的時候,結果一定是在原來陣列大小的範圍內,比如預設陣列大小16-1=15 的二進位制為: 00000000 00000000 00000000 00001111,某 key 的hash 值為:11010010 00000001 10010000 00100100,那麼與上面做與運算的時候,值會對後面的四位進行運算,肯定會落在0~15 的範圍內,假如不是 2 的倍數,那麼 length-1 的二進位制後面就不可能全是 1,做與運算的時候就會造成空間浪費

相關推薦

hashmap初試陣列大小為什麼一定要是2倍數

1、在hashmap 的底層原始碼中,首先會計算一個 key 的 hash 碼,比如計算一個字串 "1".hashcode(); 會得到 hashcode 的大小為 49,但是 hashmap 預設陣列的大小是 16,所以這樣肯定是不能存到數組裡面的,會越界2、需要再次通過一

為什麼HashMap的初始容量一定設定為16(2的整數次冪)?

HaspMap的資料結構是陣列加單鏈表,把初始容量設定為2的冪有助於HashMap中的元素存放地更均勻,降低了hash碰撞的概率,提高了查詢的效率和空間利用率。 最理想的情況是Entry陣列中每一個位置都只存放一個元素,這樣在查詢的時候不用去遍歷連結串列,這時候空間利用率最大,時間複雜度

HashMap的初始大小為什麼是2的n次冪?

下面是HashMap的一個建構函式,兩個引數initialCapacity,loadFactor 這關係HashMap的迭代效能。   關於這兩個引數值的設定界限: 1. initialCapacity是map的初始化容量,initialCapacity > M

HashMap的容量為什麼一定要是2的冪呢?

HashMap中的資料結構是陣列+單鏈表的組合,我們希望的是元素存放的更均勻,最理想的效果是,Entry陣列中每個位置都只有一個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較K,而且空間利用率最大。那如何計算才會分佈最均勻呢?我們首先想到的就

為什麼 HashMap 的容量大小設定為2的N次方?

原文連結:https://www.changxuan.top/?p=1208 前兩天,我在一位同學提交中看到了下面這樣的一行程式碼,讓我很是驚訝。 Map<String, String> temp = new HashMap<>(6)

Array.asList:陣列轉list時你一定知道的“陷阱”!

最近開發中,業務上處理,經常用到asList方法,這讓我不經想起了它的很多容易讓人犯錯的地方或者誤解的地方,所以就想抽出時間來,整理一下,和大家分享出來,深夜了,話不多說,主要以程式碼為主,簡易的程式碼,你一看就知道了! 大家都知道這個方法是將陣列轉成list,是JDK中java.util包中A

HashMap如何處理自定義大小為非2的冪次方

先上原始碼: static final int tableSizeFor(int i) {//i為自定義容器的大小 int j = i - 1; j |= j >>> 1; j

VC++中注意申請陣列之後,一定初始化,即便每次都會重新申請地址

1)對於非結構體陣列,可以使用 int a[100] memset(a,0,sizeof(int)*100) 按位元組賦值為0,或者-1; 2) 對於結構體 PATH APATH = new PATH[100]; 再寫初始化函式,不能使用memset

什麼是 雜湊表 HashMap陣列的 size 為什麼必須是 2 的整數次冪

Hash,一般翻譯做“雜湊”,也有直接音譯為“雜湊”的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,

Map集合例項練習三--HashMap與arrayList的幾種遍歷方式,重點!請一定掌握熟練

    本章節是基於例項練習一與練習二的練習例項: 以下是string的常用判斷,在實際開發中,經常使用到。 1 isNotEmpty(str)等價於 str != null && str.length > 0 2 isNotBlank(str) 等

這麼過分,一定寫篇部落格(2) —— 關於jupyter notebook的安裝配置以及Py2與Py3核心共存的系列問題

前情提要不重要 最近還是在看聚類方面的論文,用MATLAB做完FCM的實驗之後,考慮到自己一直在學Python,總覺得應該悄咪咪地實現一下這個讓我既愛又恨的演算法嘻嘻。之後查資料時看到各位大佬瘋狂安利Ipython notebook(也就是本文介紹的jupyt

知道為啥HashMap裡面的陣列size必須是2的次冪?

最近在寫一個簡易的分離鎖的類: 要求:對不同的Key進行hash得到一個Lock,並要求對鎖對映的概率差不多。比如,160個Key,分佈到16個鎖上,大概有10個Key是對映到同一個鎖上的,只要這樣併發效率才會高。 Java程式碼   public clas

jdk1.8 HashMap底層資料結構:深入解析為什麼jdk1.8 HashMap的容量一定要是2的n次冪

前言   1.本文根據jdk1.8原始碼來分析HashMap的容量取值問題;   2.本文有做 jdk1.8 HashMap.resize()擴容方法的原始碼解析:見下文“一、3.擴容:同樣需要保證擴容後的容量是2的n次冪”;   3.目錄:     一、jdk1.8中,對“HashMap的容量一定是2的n次

接口測試,添加請求頭的時候,大小寫一定正確

data 應該 一個 pty enc 格式 content 註意 log 今天同事碰到了一個問題,就是他用robot framework+requests寫接口測試用例的時候,post一個json數據的時候,發送出去的數據一直是data=<empty>,明明有數

怎樣建網站更快更省錢?這個優惠你一定知道

免費自助建站 網站建設 怎麽建網站 講道理,凡科建站要放大招優惠促銷,這個時候不該歌舞升平把酒言歡原地托馬斯全旋式炸裂直沖雲霄與鞭炮齊鳴嗎?正經點,是時候讓大家出來解釋解釋這次凡科建站“勞動好時光”的主題優惠促銷活動。 一、成龍體 其實,第一次讓我參加凡

程序員為什麽一定用Linux

linux程序員大多數人引薦Linux,基本上都會說Linux讓你更高效、更優異。然而工具只是工具。然而工具只是工具。然而工具只是工具。優異程序員和不優異程序員的差異首先是態度上的差異。他們有自個的理想,考慮許多,不管是項目開端之前還是在項目進行中,項目完結以後也會進行總結。他們對待疑問對比謹慎,考慮對比全部

有個無附加要求,噉就系你一定放咗啲

成功 一個 一聲 sha 結果 談判 未能 準備 地獄 豬妖頭頭思忖咗良久,咬咬牙說道:“得,咁就暫且相信你一次,若是失敗咗,你就得滾出白石山,永遠唔準踏進呢度半步。”“易話為嘅。”蓮歌笑住回味。「不過,我重有個無附加要求,噉就系你一定要放咗啲人族。”蓮歌睇豬妖頭頭,講出咗

為什麽程序員一定加班?

程序員一提到程序員,大多數人的印象大概就是死宅、無趣、沒有私人生活,除了上班寫寫寫代碼,加班寫代碼更是標配。似乎在深夜頂著雞窩頭,目光呆滯,面無表情敲鍵盤的場景才是一個程序員的真實寫照。當然,這也是我對於程序員的幾乎所有印象,我不知道自己的這個印象來自於哪裏,因為在之前我跟程序員是沒有接觸的。僅有的一次是大概

學web前端一定這樣學,不然學完找不到工作哭都來不及!

構建 方式 設備 市場 可能 最新動態 常見 能力 簡歷 因為工作原因,經常關註有關互聯網行業的最新動態。這不,剛送走了高考,又迎來了每年的畢業季,看到好多人都說今年的前端工作不好找,很多童鞋簡歷投了一大堆,也沒有回應,發現連實習的機會都沒有,好不容易去面試了幾次,發現到處