HashMap的容量為什麼一定要是2的冪呢?
HashMap中的資料結構是陣列+單鏈表的組合,我們希望的是元素存放的更均勻,最理想的效果是,Entry陣列中每個位置都只有一個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較K,而且空間利用率最大。那如何計算才會分佈最均勻呢?我們首先想到的就是%運算,雜湊值%容量=bucketIndex
原始碼中是怎麼做的呢?
static int indexFor(int h,int length){
//這裡的h為key呼叫hashCode方法計算出來的hash值,length為目前的容量
return h&(length-1);
}
當容量是2的冪次方時,h&(length-1)==h%length
那麼初始容量為什麼是16,以及載入因子為什麼是0.75呢?
預設載入因子 (0.75) 在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本..在設定初始容量時應該考慮到對映中所需的條目數及其載入因子,以便最大限度地降低 rehash 操作次數。
相關推薦
為什麼HashMap的初始容量一定要設定為16(2的整數次冪)?
HaspMap的資料結構是陣列加單鏈表,把初始容量設定為2的冪有助於HashMap中的元素存放地更均勻,降低了hash碰撞的概率,提高了查詢的效率和空間利用率。 最理想的情況是Entry陣列中每一個位置都只存放一個元素,這樣在查詢的時候不用去遍歷連結串列,這時候空間利用率最大,時間複雜度
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次
為什麼一定要呼叫 setlocale 呢? 因為在 C/C++ 語言標準中定義了其執行時的字符集環境為 "C" ,也就是 ASCII 字符集的一個子集。使用setlocal改變整個應用程式的字符集編碼方式(wcstombs使用前要設定 setlocale (LC_ALL, &qu
setlocale 配置地域化資訊。 語法: string setlocale(string category, string locale); 返回值: 字串 函式種類: 作業系統與環境
介面中同一個方法不寫public,為什麼在實現類中一定要寫public呢?
首先,介面中所有方法預設都是public,至於為什麼要是public,原因在於如果不是public,那麼只能在同個包下被實現,可訪問許可權就降低很多了,那麼在實現類中,實現的類相當於子類,子類的訪問許可權是不能比父類小的,而在java中一個類如果沒有許可權的修飾符,預設是f
HashMap的容量為什麼一定要是2的冪呢?
HashMap中的資料結構是陣列+單鏈表的組合,我們希望的是元素存放的更均勻,最理想的效果是,Entry陣列中每個位置都只有一個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較K,而且空間利用率最大。那如何計算才會分佈最均勻呢?我們首先想到的就
HashMap 容量為2次冪的原因
我們都知道 hashmap 的底層是一個數組加連結串列的結構,當向其中新增一個元素的時候,需要根據key的hash值,去確定其在陣列中的具體位置。 看原始碼,我們可以發現,確定陣列位置的實現是 i=(n-1)& hash,其中 n 代表陣列的長度,即map的容量。 當n為2的冪
為什麼 HashMap 的容量大小要設定為2的N次方?
原文連結:https://www.changxuan.top/?p=1208 前兩天,我在一位同學提交中看到了下面這樣的一行程式碼,讓我很是驚訝。 Map<String, String> temp = new HashMap<>(6)
七夕攻略丨中國單身達2億?8種高端創意的告白方式,到底要不要收藏呢?
活動 人才 是不是 收藏 img nbsp image main 優勢 “很絕望,找不到對象還影響經濟發展” “嗯?女朋友?是手機不好玩,還是遊戲不夠看?” “我,七夕,告白,懂?” 本以為七夕快到了 世界都是撒狗糧的人 沒想到,調皮的某媒公布出這一結果後 世界人民都不
HashMap的最大容量為什麼是2的30次方(1左移30)?
文章目錄 引言 探究過程1 -- 為什麼是30 探究過程2 -- 為什麼是 1 << 30 總結 引言 在閱讀hashmap的原始碼過程中,我看到了關於hashmap最大容量的限制,併產生了一絲疑問。 /**
(轉)為什麼operator運算子過載一定要為友元函式呢
如果是過載雙目操作符(即為類的成員函式),就只要設定一個引數作為右側運算量,而左側運算量就是物件本身 而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點,就只能申明為友元函數了 如果一定要宣告為成員函式,只能成為如下的形式:
為什麼operator運算子過載一定要為友元函式呢?
格拉德韋爾在《異數》:並非天資超人一等,而是付出了持續不斷的努力。只要經過1萬小時的錘鍊,任何人都能從平凡變成超凡”。要成為某個領域的專家,需要10000小時:如果每天工作八個小時,一週工作五天,那麼成為一個領域的專家至少需要五年。 linux原始碼線上閱讀 各種線編譯工具
我們該如何自學java呢?你得是“我一定要”!
首先,從技術角度作為計算機程式語言個人認為自學還是比較難的,通常需要學習者必需明確你學習Java的目的是什麼。對於這個問題我個人認為不外乎兩大類,其一就是出自對計算機程式設計的喜好(對Java的喜好);其二是能夠掌握Java語言技術從而利用其能夠解決自身生存問題。這兩類人通常可以肯定的說後者居多,那
hashmap初試陣列大小為什麼一定要是2 的倍數
1、在hashmap 的底層原始碼中,首先會計算一個 key 的 hash 碼,比如計算一個字串 "1".hashcode(); 會得到 hashcode 的大小為 49,但是 hashmap 預設陣列的大小是 16,所以這樣肯定是不能存到數組裡面的,會越界2、需要再次通過一
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
阿里巴巴Java開發手冊建議建立HashMap時設定初始化容量,但是多少合適呢?
集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的資料結構,HashMap對於Java開發者一定不陌生。 關於HashMap,很多人都對他有一些基本的瞭解,比如他和hashtable之間的區別、他和concurrentHashMap之間的區別等。這些都是比較常見的,關於HashMap的一
接口測試,添加請求頭的時候,大小寫一定要正確
data 應該 一個 pty enc 格式 content 註意 log 今天同事碰到了一個問題,就是他用robot framework+requests寫接口測試用例的時候,post一個json數據的時候,發送出去的數據一直是data=<empty>,明明有數
怎樣建網站更快更省錢?這個優惠你一定要知道
免費自助建站 網站建設 怎麽建網站 講道理,凡科建站要放大招優惠促銷,這個時候不該歌舞升平把酒言歡原地托馬斯全旋式炸裂直沖雲霄與鞭炮齊鳴嗎?正經點,是時候讓大家出來解釋解釋這次凡科建站“勞動好時光”的主題優惠促銷活動。 一、成龍體 其實,第一次讓我參加凡
程序員為什麽一定要用Linux
linux程序員大多數人引薦Linux,基本上都會說Linux讓你更高效、更優異。然而工具只是工具。然而工具只是工具。然而工具只是工具。優異程序員和不優異程序員的差異首先是態度上的差異。他們有自個的理想,考慮許多,不管是項目開端之前還是在項目進行中,項目完結以後也會進行總結。他們對待疑問對比謹慎,考慮對比全部