hashMap原理(一)

概念

HashMap是java中一種非常常用的基于哈希表的數據結構,允許o(1)

的時間復雜度進行元素插入,查找,和刪除。它通過”鍵-值“ 對的方式存儲數據。

總的來說:HashMap的底層原理:數組+鏈表+紅黑樹(jdk1.8之后還涉及紅黑樹)。

哈希函數與哈希值:每個鍵都會通過哈希函數計算哈希值,然后通過哈希值決定數組在那個桶(buxket)中。桶是一個數組的存儲位置。

數組:hashmap底層是一個數組,每個數組元素存放一個鏈表或者紅黑樹(1.8之后)

當新元素插入hashmap時,它首先根據哈希值找到數組中的某個位置(桶)。如果該位置為空,則

則直接插入;如果該位置已經存在了元素(發生碰撞),鏈表或紅黑樹解決沖突。

hash沖突——鏈表和紅黑樹:

如果發生哈希沖突,hashMap會將相同的哈希值的元素以鏈表的形式存儲在一個桶中(數組的某個位置)。

當鏈表長度過長時候,時間復雜度變為O(n).當鏈表長度超過一定的閾值(默認是8)時,鏈表會轉換為紅黑樹,從而將時間復雜度從O(n)降低到O(log n).

負載因子和擴容:

Hash Map有一個重要的參數叫負載因子,它決定了當數組中元素數量超過數組容量的多大比例時,會觸發擴容操作。默認負載因子是0.75,當HashMap的元素數量達到數組容量的75%時,HashMap會自動擴容,通常會將數組容量擴展為原來的2倍。擴容時,HashMap會重新分配一個更大的數組,并將原來的數組映射到新的數組中,這個過程叫做rehashing。過程比較耗時,因為要重新計算每個元素的哈希值,并將其放入桶中。

源碼分析:

HashMap 的默認初始化容量是 16,負載因子是 0.75。

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final float DEFAULT_LOAD_FACTOR = 0.75f;

HashMap 的 put 方法是插入元素的核心邏輯。
hash() 方法計算鍵的哈希值。為了減少哈希沖突,它通過異或運算將高位信息與低位結合,混合高位與低位的位信息.

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);
}

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

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

相關文章

Ubuntu24 輔助系統-屏幕鍵盤的back按鍵在網頁文本框刪除不正常的問題解決方法

Ubuntu24 輔助系統-屏幕鍵盤的back按鍵異常 問題描述ubuntu24這個屏幕鍵盤&#xff0c;只有在網頁的搜索框或者文本框&#xff0c;比如百度首頁的搜索框&#xff0c;留言的文本框&#xff0c;才會出現點擊back按鈕的時候&#xff0c;出現了先選中當前這個字符&#xff0c;刪除此…

自然語言指令驅動的工業機器人協同學習系統:大語言模型如何重塑智能體協作范式

重磅推薦專欄: 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用,以及與之相關的人工智能生成內容(AIGC)技術。通過深入的技術解析和實踐經…

web:js的switch語句

在js中,switch語句是一種用于根據不同的條件執行不同代碼塊的控制流語句。它類似于多個if...else if...else語句,但結構更清晰,特別是在有多個條件分支的情況下。 基本語法 switch (expression) {case value1:// 當expression的值等于value1時執行這里的代碼break;case va…

為何說分布式 AI 推理已成為下一代計算方式

2024 年&#xff0c;我們見證了人工智能創新的空前爆發。AI 的快速發展令很多人驚嘆&#xff0c;為了訓練更先進的大語言模型&#xff08;LLM&#xff09;&#xff0c;科技巨頭爭相獲取強大的 GPU。如今&#xff0c;AI 正在無縫融入我們世界的每個角落。在眾多新興 AI 公司、模…

阿里云 RabbitMQ 可觀測性最佳實踐

阿里云 RabbitMQ 阿里云 RabbitMQ 是一款高性能、高可靠的消息中間件&#xff0c;支持多種消息協議和豐富的功能特性。它提供消息隊列功能&#xff0c;能夠實現應用間的消息解耦和異步通信&#xff0c;提升系統擴展性和穩定性。其支持多種消息持久化策略&#xff0c;確保消息不…

vue-router 導航式編程 參數的設置

主要是想記錄一下this.$router.push、replace、go等方法的參數如何設置。字符串路徑router.push(/home)直接使用字符串&#xff08;或模板字符串&#xff09;路徑&#xff0c;可跳轉到相應的URL路徑。對象式路徑路徑也可以是一個對象&#xff0c;對象里以key:value的形式表示UR…

Swift實現股票圖:從基礎到高級

目錄一、核心實現方案1. 原生方案&#xff1a;使用 Core Graphics 繪制2. 使用第三方庫&#xff1a;Charts3. 跨平臺方案&#xff1a;使用 SwiftUI Canvas二、技術指標實現1. 移動平均線 (MA)2. 布林帶 (Bollinger Bands)3. MACD (Moving Average Convergence Divergence)三、…

【unitrix】 6.4 數特征(number.rs)

一、源碼 這段代碼定義了一個名為Number的trait&#xff08;特質&#xff09;以及它的實現。 use crate::sealed::Sealed; use crate::number::{V, BaseNumber, TNumber};/// 數值的統一標記特質 /// 可以是編譯時類型化數字(TNumber)或運行時變量(V<T>) pub trait Numbe…

AI治AI:大語言模型自檢新法

“以火攻火”的思路解決大語言模型(LLMs)“幻覺”問題 虛構是由于與提示無關的內部因素而不可預測地從 LLM 中出現的幻覺。作者專注于衡量 LLM 對提示響應的不確定性,使用高不確定性表示虛構的假設。他們通過計算一個稱為熵的量來估計這種不確定性**,熵可以被認為是模型生…

ESLint 配置錯誤:ReferenceError: prettier is not defined 解決方案

問題描述在使用 pnpm lint 運行 ESLint 時&#xff0c;出現以下錯誤&#xff1a;Oops! Something went wrong! :( ESLint: 9.31.0 ReferenceError: prettier is not defined該錯誤導致 ESLint 無法正確執行代碼格式檢查&#xff0c;但 不會影響項目的實際運行&#xff08;如 pn…

數據結構--準備知識

一.算法效率算法效率分為兩種&#xff1a;第一種為時間效率&#xff0c;第二種為空間效率。時間效率稱為時間復雜度&#xff0c;空間效率稱為空間復雜度。時間復雜主要衡量一個算法的運行速度&#xff0c;空間復雜度主要衡量一個算法所需的 額外的空間&#xff08;現在不需要特…

HTML 入門教程:從零開始學習網頁開發基礎

一、HTML簡介 1.1 什么是HTML&#xff1f; HTML全稱是Hyper Text Markup Language&#xff08;超文本標記語言&#xff09;&#xff0c;由Tim Berners-Lee和同事Daniel W. Connolly于1990年創立。它是一種用于創建網頁的標準標記語言&#xff0c;而不是編程語言。 1.2 HTML的…

使用 bat 批量創建帶有項目前綴名的文件夾結構

在項目管理中&#xff0c;經常需要為每個新項目創建一套標準化的文件夾結構。如文檔中所述&#xff0c;用戶希望為每個項目&#xff08;如"Project 1"、“Project 2”&#xff09;創建以下結構的文件夾&#xff1a; project-1_export\project-1_DWG project-1_expo…

Python類中魔術方法(Magic Methods)完全指南:從入門到精通

文章目錄Python類中魔術方法(Magic Methods)完全指南&#xff1a;從入門到精通一、魔術方法基礎1. 什么是魔術方法&#xff1f;2. 魔術方法的特點二、常用魔術方法分類詳解1. 對象創建與初始化2. 對象表示與字符串轉換3. 比較運算符重載4. 算術運算符重載5. 容器類型模擬6. 上下…

H3CNE綜合實驗之五角星

H3CNE綜合實驗之五角星 實驗拓撲圖交換機地址規劃表&#xff1a;SW6G1/0/1Vlan100:10.1.3.2/24G1/0/2Vlan90:10.1.4.2/24G1/0/3Vlan50:10.1.5.1/24G1/0/4Vlan60&#xff1a;10.1.6.1/24SW7G1/0/1Vlan50:10.1.5.2/24G1/0/2Vlan30:192.168.3.1/24G1/0/6Vlan70:10.1.1.2/24G1/0/3-…

Android EventBus使用方法與底層原理詳解

EventBus 是什么&#xff1f; EventBus 是一個基于發布/訂閱&#xff08;Publish/Subscribe&#xff09; 模式的開源庫&#xff08;主要由 greenrobot 開發維護&#xff09;。它的核心目的是簡化 Android 應用中不同組件&#xff08;如 Activity, Fragment, Service, Thread 等…

初等數論簡明教程

初等數論簡明教程 本文給出初等數論中的一些重要的定理與例題&#xff0c;證明風格采用 整除線法 與 命題節點法。 整除線法 指推理的第 nnn 步左邊的字符可由前面左邊的字符得到&#xff0c;右邊的字符可由前面右邊的字符得到&#xff0c;整除線變成了推理線&#xff0c;既少…

Spring之核心容器(IoC,DI,基本操作)詳解

Spring之核心容器IoC/DI/基本操作詳解一、核心概念&#xff1a;IoC與DI的本質1.1 IoC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09;傳統開發模式&#xff08;無IoC&#xff09;IoC模式&#xff08;Spring容器管理&#xff09;1.2 DI&#xff08;Dependenc…

【論文閱讀】基于注意力機制的冥想腦電分類識別研究(2025)

基于注意力機制的冥想腦電分類識別研究&#x1f4a1; Meta DataTitle基于注意力機制的冥想腦電分類識別研究Authors周梓涵Pub. date2025&#x1f4dc; Research Background & Objective背景&#xff1a; 現代生活壓力導致心理問題日益突出&#xff0c;冥想作為一種有效的心…

GitHub 上 Star 數量前 8 的開源 Web 應用項目

原文鏈接&#xff1a;https://www.nocobase.com/cn/blog/github-open-source-web-applications。 近期&#xff0c;我們發布了多篇「Top GitHub Star 開源項目推薦」系列文章&#xff0c;受到了大量點贊與收藏&#xff0c;很多開發者留言表示希望能看到更多不同領域的開源工具推…