HashMap中put()方法的執行流程

HashMap 是 Java 中最常用的數據結構之一,用于存儲鍵值對。其 put() 方法是向哈希表中插入或更新鍵值對的核心操作。本文將詳細解析 put() 方法的執行過程,涵蓋哈希值計算、桶定位、沖突處理和擴容等步驟。


一、put() 方法的執行過程

put() 方法通過一系列步驟實現鍵值對的高效存儲和更新。以下是詳細的執行流程:

1. 計算鍵的哈希值

  • 步驟:HashMap 首先調用鍵的 hashCode() 方法獲取其哈希碼。
  • 擾動處理:為了減少哈希沖突,HashMap 對哈希碼進行擾動處理,具體通過 (h = key.hashCode()) ^ (h >>> 16),將高 16 位與低 16 位進行異或操作,增加哈希值的隨機性。
  • 特殊情況:如果鍵為 null,哈希值固定為 0(HashMap 允許一個 null 鍵)。

2. 確定桶位置

  • 計算索引:使用哈希值通過公式 index = hash & (table.length - 1) 計算鍵值對在數組(桶)中的索引位置。
  • table 初始化:table 是 HashMap 內部用于存儲節點的數組。如果 table 未初始化(即 table == null 或 table.length == 0),會調用 resize() 方法初始化數組。

3. 處理桶中的情況

根據目標桶(table[index])的狀態,put() 方法會執行不同的邏輯:

情況 1:桶為空
  • 如果桶中沒有節點,直接創建一個新的 Node(包含鍵、值、哈希值等信息)并放入該桶。
情況 2:桶中已有節點
  • 3.2.1 檢查第一個節點
    • 如果桶中第一個節點的鍵與插入的鍵相同(通過哈希值比較和 equals() 方法確認),直接更新該節點的值。
  • 3.2.2 處理紅黑樹
    • 如果桶中節點數量較多(超過 TREEIFY_THRESHOLD,默認為 8),且桶已轉為紅黑樹結構,調用紅黑樹的插入方法(putTreeVal)處理插入或更新。
  • 3.2.3 處理鏈表
    • 如果桶中是鏈表結構,遍歷鏈表:
      • 如果找到鍵相同的節點,更新其值。
      • 如果沒有找到相同鍵,將新節點添加到鏈表末尾。
    • 插入后,如果鏈表長度大于等于8且數組長度達到64時,調用 treeifyBin() 將鏈表轉換為紅黑樹。
情況 3:桶中鍵為 null
  • 如果插入的鍵為 null,存儲到索引為 0 的桶中(HashMap 只允許一個 null 鍵)。

4. 更新大小和檢查擴容

  • 更新 size:插入新鍵值對后,HashMap 的 size(鍵值對數量)加 1。
  • 檢查擴容:如果 size 超過閾值(threshold = table.length * loadFactor,默認負載因子為 0.75),觸發 resize() 方法進行擴容。
  • 擴容:將數組的容量擴大為原來的2倍。

5. 返回舊值

  • 如果插入的鍵已存在,put() 方法返回該鍵對應的舊值。
  • 如果是新插入的鍵值對,返回 null。

二、核心代碼分析

以下是 put() 方法的核心邏輯:

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);
}// 計算哈希值
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}// putVal 核心實現
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;// 如果 table 未初始化,調用 resize()if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;// 計算索引,檢查桶是否為空if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null); // 直接插入新節點else {Node<K,V> e; K k;// 檢查第一個節點是否匹配if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))e = p;// 如果是紅黑樹,調用樹插入邏輯else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);// 遍歷鏈表else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null); // 插入到鏈表末尾// 檢查是否需要轉為紅黑樹if (binCount >= TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash);break;}// 找到相同鍵if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}// 如果找到已有鍵,更新值if (e != null) {V oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}// 增加 size,檢查是否需要擴容if (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

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

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

相關文章

【Oracle認證】MySQL 8.0 OCP 認證考試英文版(MySQL30 周年版)

文章目錄 1、MySQL OCP考試介紹2、考試注冊流程3、考試復習題庫 Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免費考取原價245美元 &#xff08;約1500&#xff09;的MySQL OCP 認證。 1、MySQL OCP考試介紹 OCP考試 OCP認證是Oracle公司推…

SpringBoot框架開發網絡安全科普系統開發實現

概述 基于SpringBoot框架的網絡安全科普系統開發指南&#xff0c;該系統集知識科普、案例學習、在線測試等功能于一體&#xff0c;本文將詳細介紹系統架構設計、功能實現及技術要點&#xff0c;幫助開發者快速構建專業的網絡安全教育平臺。 主要內容 系統功能架構 本系統采…

瀏覽器HTTP錯誤、前端常見報錯 和 Java后端報錯

以下是 瀏覽器HTTP錯誤、前端常見報錯 和 Java后端報錯 的綜合整理&#xff0c;包括原因和解決方法&#xff0c;幫助你快速排查問題。 一、HTTP 錯誤&#xff08;瀏覽器報錯&#xff09; 錯誤碼原因解決方法400 Bad Request請求語法錯誤&#xff08;如參數格式錯誤、請求體過…

TypeScript簡介

&#x1f31f; TypeScript入門 TypeScript 是 JavaScript 的超集&#xff0c;由微軟開發并維護&#xff0c;通過靜態類型檢查和現代語言特性&#xff0c;讓大型應用開發變得更加可靠和高效。 // 一個簡單的 TypeScript 示例 interface User {name: string;age: number;greet():…

[ctfshow web入門] web57

信息收集 這下把.也過濾了&#xff0c;臨時文件上傳無法使用了 //flag in 36.php if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\;|[a-z]|[0-9]|\|\|\#|\|\"|\|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\|\[/i", $c)){system("cat ".$c…

Android 移動應用開發:頁面跳轉與數據傳遞功能

目錄 ? 運行效果說明 &#x1f4c1; 文件一&#xff1a;MainActivity.java&#xff08;語言&#xff1a;Java&#xff09; &#x1f4c1; 文件二&#xff1a;Edit_MainActivity.java&#xff08;語言&#xff1a;Java&#xff09; &#x1f4c1; 文件三&#xff1a;activi…

MySQL如何優雅的執行DDL

一、概述 在MySQL中&#xff0c;DDL&#xff08;數據定義語言&#xff09;語句用于定義和管理數據庫結構&#xff0c;包括創建、修改和刪除數據庫對象&#xff08;如表、索引等&#xff09;。執行DDL操作時&#xff0c;需要謹慎處理&#xff0c;以避免對生產環境的穩定性和性能…

onenet連接微信小程序(mqtt協議)

一、關于mqtt協議 mqtt協議常用于物聯網&#xff0c;是一種輕量級的消息推送協議。 其中有三個角色&#xff0c;Publisher設備&#xff08;客戶端&#xff09;發布主題到服務器&#xff0c;其他的設備通過訂閱主題&#xff0c;獲取該主題下的消息&#xff0c;Publisher可以發…

【Unity筆記】實現支持不同渲染管線的天空盒曝光度控制組件(SkyboxExposureController)——參數化控制

寫在前面 在Unity中&#xff0c;天空盒&#xff08;Skybox&#xff09;不僅承擔視覺上的背景作用&#xff0c;更是場景環境光照與氛圍塑造的重要組成部分。不同時間、天氣、場景轉換等&#xff0c;都需要靈活調整天空的亮度。而**曝光度&#xff08;Exposure&#xff09;**就是…

blender云渲染指南2025版

一、云渲染核心概念 Blender云渲染是將本地渲染任務遷移到云端服務器集群的技術&#xff0c;通過分布式計算實現效率提升100倍以上的解決方案&#xff0c;其核心邏輯是&#xff1a;用戶上傳Blender項目文件至【渲染101】等云平臺&#xff0c;云端調用高性能服務器&#xff08;…

火語言RPA--七牛云存儲

【組件功能】&#xff1a;存儲本地文件至七牛云 選擇本地文件&#xff0c;通過七牛云存儲配置上傳至七牛云對象存儲的指定地域指定存儲桶指定路徑。 配置預覽 配置說明 AccessKey 支持T或# 前往官網獲取或創建。參考鏈接&#xff1a;https://portal.qiniu.com/user/key Se…

小剛說C語言刷題—1004階乘問題

1.題目描述 編程求 123?n 。 輸入 輸入一行&#xff0c;只有一個整數 n(1≤n≤10)&#xff1b; 輸出 輸出只有一行&#xff08;這意味著末尾有一個回車符號&#xff09;&#xff0c;包括 1 個整數。 樣例 輸入 5 輸出 120 2.參考代碼(C語言版) #include <stdio…

C語言| sizeof(array)占多少字節

C語言| 數組名作為函數參數 sizeof(數組名); 可以求出整個數組在內存中所占的字節數。 被調函數Array_Sum()中&#xff0c;數組array使用sizeof會得到多少&#xff1f; 實參數組a占32字節&#xff0c;實參a傳給形參array&#xff0c;只占4字節。 原因如下&#xff1a; 數組名做…

Xcavate 上線 Polkadot |開啟 Web3 房地產投資新時代

在傳統資產 Tokenization 浪潮中&#xff0c;Xcavate 以房地產為切口迅速崛起。作為 2023 年 OneBlock 冬季波卡黑客松冠軍&#xff0c;Xcavate 憑借創新的資產管理與分發機制&#xff0c;在波卡生態中嶄露頭角。此次主網上線&#xff0c;標志著 Xcavate 正式邁入全球化應用階段…

學習心得《How Global AI Policy and Regulations Will Impact Your Enterprise》Gartner

AI時代來臨,然而與之對應的是海量的數據的安全性和合規性如何保障,如何平衡個人與智能體的利益,恰巧,最近Gartner發布了《How Global AI Policy and Regulations Will Impact Your Enterprise》,我們就其中的觀點一起進行探討。 戰略規劃假設 我們首先關注的是關鍵的戰略…

Inno Setup專業打包指南:從基礎到高級應用

Inno Setup專業打包指南&#xff1a;從基礎到高級應用 Inno Setup是一款免費開源的Windows安裝程序制作工具&#xff0c;以其輕量、易用、功能強大而備受開發者青睞。它通過腳本語言定義安裝行為&#xff0c;能夠創建標準的Windows安裝向導&#xff0c;支持文件安裝、注冊表操…

VScode中關于Copilot的騷操作

目錄 1. Ctrl I 直接在工作區對話 2.Tab 黨福音&#xff1a;寫注釋生成代碼 3. 連續寫幾行函數頭&#xff0c;Copilot 會自動“補全全函數” 4. 自動寫單元測試 5. 在注釋中要求它寫某種風格 6. 代碼重寫器 7. 多語言切換無痛自動翻譯 8. 在空文件中寫注釋&#xff0c…

虛擬專用服務器(VPS)完全指南:從入門到選型

開篇導讀 VPS&#xff08;虛擬專用服務器&#xff09;作為介于共享主機與獨立服務器之間的托管方案&#xff0c;通過獨享資源保障性能本文將系統解析VPS的核心優勢、適用場景及選型策略&#xff0c;助您實現從共享主機到VPS的平滑過渡 什么是虛擬專用服務器&#xff1f; 服務…

前端取經路——性能優化:唐僧的九道心經

大家好&#xff0c;我是老十三&#xff0c;一名前端開發工程師。性能優化如同唐僧的九道心經&#xff0c;是前端修行的精髓所在。在本文中&#xff0c;我將為你揭示從網絡傳輸到渲染優化的九大關鍵技術&#xff0c;涵蓋HTTP協議、資源加載策略、緩存控制等核心難題。通過這些實…

[論文閱讀]Deeply-Supervised Nets

摘要 我們提出的深度監督網絡&#xff08;DSN&#xff09;方法在最小化分類誤差的同時&#xff0c;使隱藏層的學習過程更加直接和透明。我們嘗試通過研究深度網絡中的新公式來提升分類性能。我們關注卷積神經網絡&#xff08;CNN&#xff09;架構中的三個方面&#xff1a;&…