深入解析HashMap的存儲機制:擾動函數、哈希計算與索引定位

今天復習了一下HashMap的部分,寫一篇博客記錄一下今天學習內容

雖然之前學習過,但由于后來沒怎么使用過而且也沒復習基本忘得差不多了

在Java的HashMap中,高效存儲鍵值對的核心在于哈希算法和索引定位。本文將結合源碼逐步拆解存儲流程,并給出代碼示例。

?核心流程概述
  1. 擾動函數處理Key?通過擾動函數優化Key的哈希值,減少碰撞
  2. 存儲哈希值?計算后的哈希值存入Node對象的hash字段
  3. 計算桶下標?用(n-1) & hash定位數組索引(n為數組長度)
  4. 存入數據結構?根據下標存入數組(或鏈表/紅黑樹)
?源碼級分步解析(基于JDK 17)
① 擾動函數與哈希計算
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

  • 作用:將原始哈希碼的高16位與低16位異或
  • 目的:讓高位參與運算,解決低位相同導致的哈希碰撞
  • 結果:擾動后的哈希值存儲在Node的hash字段
② Node對象結構
static class Node<K,V> implements Map.Entry<K,V> {final int hash; // 存儲擾動計算后的哈希值final K key;V value;Node<K,V> next; // 鏈表結構指針
}

③ 索引定位公式
// 在putVal方法中:
int index = (n - 1) & hash;
  • n-1:當前數組長度減1(如長度16→15,二進制0...01111
  • 位與運算:高效實現取模運算,hash % n等價于(n-1) & hash
    ④ 完整put流程偽代碼
    final V putVal(int hash, K key, V value) {Node<K,V>[] tab; Node<K,V> p; int n, i;// 1. 首次使用觸發初始化if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;// 2. 計算桶下標 (核心公式)i = (n - 1) & hash;// 3. 處理碰撞情況if ((p = tab[i]) == null) tab[i] = newNode(hash, key, value); // 無碰撞直接存else {// 碰撞后遍歷鏈表/紅黑樹if (p.hash == hash && ...)// 更新已存在key的值else {// 鏈表新增節點if (binCount >= TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash); // 鏈表轉紅黑樹}}
    }

    舉個🌰 實戰示例與驗證
    import java.util.*;public class HashMapDemo {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>(16); // 初始容量16// 存儲鍵值對 "A":1map.put("A", 1);// 手動驗證存儲過程String key = "A";// 1. 原始哈希碼int hashCode = key.hashCode(); System.out.println("原始哈希碼: 0x" + Integer.toHexString(hashCode));// 2. 擾動計算int perturbedHash = hash(key);System.out.println("擾動哈希值: 0x" + Integer.toHexString(perturbedHash));// 3. 計算桶下標 (n=16)int n = 16;int index = (n - 1) & perturbedHash;System.out.println("數組下標: " + index);}// JDK擾動函數實現static int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
    }

    輸出結果

    原始哈希碼: 0x41
    擾動哈希值: 0x41  // 小值無高位變化
    數組下標: 1       // (16-1)=15: 0b1111 & 0x41=65 → 1
    ?設計原理深度剖析
    1. 為什么用位與代替取模?

      • 位運算(n-1) & hash%效率高10倍以上(實測)
      • 前提:數組長度必須是2的冪(保證n-1的二進制全為1)
    2. 擾動函數的必要性

       原始哈希: 0x1234abcd 和 0x5678abcdn=16時:未擾動 → 兩值低位相同 → 碰撞擾動后 → 高位參與運算 → 低位不同 → 避免碰撞

    ? ? ?3.哈希碰撞策略

    最佳實踐建議
    1. 避免自定義Key哈希碰撞
       // 錯誤實現:所有對象返回相同哈希碼@Overridepublic int hashCode() { return 1; } // 導致HashMap退化為鏈表// 正確實現:組合關鍵字段哈希@Overridepublic int hashCode() {return Objects.hash(field1, field2);}

    1. 初始化容量優化
       // 預期存儲1000個元素時new HashMap<>(2048); // 避免擴容 (1000/0.75≈1333 → 取2的冪2048)

    至此,本章的內容結束,后續我會補充一下在高并發情況下HashMap會出現的一些問題? ??

        本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
        如若轉載,請注明出處:http://www.pswp.cn/news/919679.shtml
        繁體地址,請注明出處:http://hk.pswp.cn/news/919679.shtml
        英文地址,請注明出處:http://en.pswp.cn/news/919679.shtml

        如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

        相關文章

        【機器學習 / 深度學習】基礎教程

        階段一&#xff1a;機器學習 / 深度學習基礎教程定位&#xff1a;針對準備進入 AI多智能體開發 的初學者&#xff0c;打牢機器學習與深度學習的基礎。一、為什么需要學習機器學習/深度學習 在進入智能體&#xff08;Agent&#xff09;開發之前&#xff0c;必須具備一定的 機器學…

        ESP32應用——HTTP client(ESP-IDF框架)

        目錄 一、前言 二、URL 2.1 URL簡介 2.2 URL示例 三、HTTP 3.1 HTTP協議概述 3.2 HTTP的工作原理 3.2.1 HTTP 請求-響應流程 3.2.2 HTTP 請求結構 3.2.3 HTTP請求方法 3.2.4 HTTP響應結構 3.2.5 HTTP狀態碼 四、ESP HTTP 客戶端流程 五、ESP HTTP 客戶端實戰解析…

        動學學深度學習07-現代卷積神經網絡

        動學學深度學習pytorch 參考地址&#xff1a;https://zh.d2l.ai/ 文章目錄動學學深度學習pytorch1-第07章-現代卷積神經網絡1. AlexNet1.1 AlexNet 的核心貢獻是什么&#xff1f;1.2 AlexNet 與 LeNet 的主要區別有哪些&#xff1f;1.3 為什么 AlexNet 需要 GPU 訓練&#xff1…

        詳細講解Java中的反射和經典面試題(保姆級別)

        1.1 反射的概述&#xff1a;專業的解釋&#xff08;了解一下&#xff09;&#xff1a;是在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意屬性和方法&#xff1b;這種動態獲取…

        MyCAT完整實驗報告

        MyCAT完整實驗報告 ? 前言 剛剛看了一下前面的那篇MyCAT的文章 感覺有一些問題 所以拿出一篇文章再說一下 單獨構建了完整的實驗環境 這樣會全面一點 ? 安裝MyCAT #跳過? 主從配置 #不多追溯 因為我們選擇的主從 也可以做雙主機 但我們后邊再說? 環境搭建 一、環境規劃 服務…

        機器翻譯論文閱讀方法:頂會(ACL、EMNLP)論文解析技巧

        更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、論文選擇:快速判斷論文價值 1.1 關注核心會議與子領域 1.2 篩選標準 1.3 預讀篩選 1.4 快速定位關鍵信息 二、精讀解析 2.1 問題定義(5分鐘) 2.2 方法解剖(15分鐘) 2.3 實驗深挖(20分鐘) 2.4 批判性思考(10分…

        Transformer模型實戰篇

        引入 基于Transformers的NLP解決方案的步驟如下&#xff1a;&#xff08;以文本分類為例&#xff09; 導入相關包&#xff0c;General&#xff0c;可以詢問ai需要導什么包加載數據集&#xff0c;Data_loader&#xff0c;Datasets數據集劃分&#xff0c;測試機&#xff0c;驗證集…

        深入(流批【牛批】框架)Flink的機制

        flink本身是專注有狀態的無限流處理&#xff0c;有限流處理【batch批次】是無限流處理的一中特殊情況&#xff01;應用場景實時ETL 集成流計算現有的諸多數據通道和SQL靈活的加工能力&#xff0c;對流式數據進行實時清洗、歸并和結構化 處理&#xff1b;同時&#xff0c;對離線…

        Git 2.15.0 64位安裝步驟Windows詳細教程從下載到驗證(附安裝包下載)

        一、下載后雙擊運行 安裝包下載&#xff1a;https://pan.quark.cn/s/7200b32a1ecf&#xff0c;找到下載好的文件&#xff1a;?Git-2.15.0-64-bit.exe?雙擊這個文件&#xff0c;就會彈出安裝向導窗口&#xff0c;點 ??“Next”&#xff08;下一步&#xff09;?? 二、選擇…

        在職老D滲透日記day23:sqli-labs靶場通關(第29關-31關)http參數過濾

        5.29.第29關 http參數過濾 閉合5.29.1.手動注入&#xff08;1&#xff09;判斷注入類型、注入點閉合&#xff08;2&#xff09;有回顯&#xff0c;優先用聯合查詢注入&#xff0c;判讀字段數?id1&id2 order by 3 -- ?id1&id2 order by 4 --&#xff08;3&#xff09;…

        Spring Boot整合Amazon SNS實戰:郵件訂閱通知系統開發

        Spring Boot整合Amazon SNS實戰引言配置服務總結新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐&#xff08;Amazon Free Tier&#xff09;。注冊即可獲得 100 美元的服務抵扣金&#xff0c;在探索關鍵亞馬遜云科技服務時可以再額…

        LeetCode_動態規劃1

        動態規劃1.動態規劃總結1.1 01背1.1.1 二維數組1.1.2 一維數組1.2 完全背包2.斐波那契數(力扣509)3.爬樓梯(力扣70)4.使用最小花費爬樓梯(力扣746)5.不同路徑(力扣62)6.不同路徑 II(力扣63)7.整數拆分(力扣343)8.不同的二叉搜索樹(力扣96)9.分割等和子集(力扣416)10.最后一塊石…

        【STM32】HAL庫中的實現(九):SPI(串行外設接口)

        SPI 接口通信原理 SPI&#xff08;Serial Peripheral Interface&#xff09;是全雙工主從通信協議&#xff0c;特點是&#xff1a; 信號線功能SCK串行時鐘MOSI主設備輸出&#xff0c;從設備輸入MISO主設備輸入&#xff0c;從設備輸出CS&#xff08;NSS&#xff09;片選信號&am…

        Git常用操作大全(附git操作命令)

        Git常用操作大全 一、基礎配置 1.1 設置用戶名和郵箱 git config --global user.name "你的名字" git config --global user.email "你的郵箱"1.2 查看配置 git config --list二、倉庫管理 2.1 初始化本地倉庫 git init2.2 克隆遠程倉庫 git clone <倉庫…

        詳解flink table api基礎(三)

        文章目錄1.使用flink的原因&#xff1a;2. Flink支持兩種模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select語句&flink table api&#xff1a;6. 使用flink table api 創建table7. 使用flink table api 寫流式數據輸出到表或sink8.…

        Vue2+Vue3前端開發_Day5

        參考課程: 【黑馬程序員 Vue2Vue3基礎入門到實戰項目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定義指令 基本語法&#xff08;全局 & 局部注冊&#xff09; 介紹&#xff1a;自己定義的指令&#xff0c;可以封裝一些 DOM 操作&#xff0c…

        機器學習--決策樹2

        目錄 第一代裁判&#xff1a;ID3 與信息增益的 “偏愛” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指數” 新思路 遇到連續值&#xff1f;先 “砍幾刀” 再說 給決策樹 “減肥”&#xff1a;剪枝的學問 動手試試&#xff1…

        yggjs_react使用教程 v0.1.1

        yggjs_react是一個用于快速創建React項目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等現代前端技術棧&#xff0c;幫助開發者快速搭建高質量的React應用。 快速入門 快速入門部分將指導您如何安裝yggjs_react工具、創建新項目并啟動開發服務器。 安…

        vulhub可用的docker源

        這一塊不太容易找&#xff0c;我試了好幾個源&#xff0c;下面是20250820測試可用源 編輯方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置內容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

        基于YOLOv8-SEAttention與LLMs融合的農作物害蟲智能診斷與防控決策系統

        1. 引言 1.1 研究背景與意義 農作物蟲害是制約農業產量與質量的重要因素。據FAO報告&#xff0c;全球每年因病蟲害造成的糧食損失高達 20%–40%。傳統人工巡查與經驗診斷具有時效性差、成本高與專業人才不足等缺陷。近年來&#xff0c;計算機視覺特別是目標檢測技術在農業檢測…