哈希表(Hashtable)核心知識點詳解

1. 基本概念
  • 定義:通過鍵(Key)直接訪問值(Value)的數據結構,基于哈希函數將鍵映射到存儲位置。

  • 核心操作

    • put(key, value):插入鍵值對

    • get(key):獲取鍵對應的值

    • remove(key):刪除鍵值對

  • 時間復雜度(平均):

    • 插入、查找、刪除:O(1)

    • 最壞情況(哈希沖突嚴重時):O(n)


2. 哈希函數設計
  • 作用:將任意大小的鍵轉換為固定大小的哈希值(通常為整數)。

  • 設計要求

    • 一致性:相同鍵必須產生相同哈希值

    • 均勻性:不同鍵應均勻分布,減少沖突

  • 常見哈希函數

    // Java的String.hashCode()實現
    public int hashCode() {int h = 0;for (char c : value) {h = 31 * h + c;}return h;
    }

3. 哈希沖突解決

當不同鍵映射到同一位置時:

  • 鏈地址法(Separate Chaining):

    • 每個桶(bucket)存儲鏈表或紅黑樹(如Java 8+的HashMap)

    • 沖突時,新元素添加到鏈表末尾

  • 開放尋址法

    • 線性探測:沖突后順序查找下一個空槽

    • 平方探測:按平方步長跳躍查找


4. 負載因子與擴容
  • 負載因子(Load Factor)

    • 定義:元素數量 / 桶數量(默認0.75)

    • 作用:觸發擴容的閾值(如Java HashMap)

  • 擴容機制

    • 新容量通常為原來的2倍

    • 重新計算所有鍵的哈希位置(rehash)


5. 常見實現對比
HashMapHashtableConcurrentHashMap
線程安全不安全安全(全表鎖)安全(分段鎖)
Null鍵值允許不允許不允許
性能中等

6. Java中的關鍵實現細節
  • HashMap的樹化優化

    • 當鏈表長度≥8且桶數量≥64時,鏈表轉為紅黑樹(防止DoS攻擊)

  • 哈希擾動函數

    
    static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    • 通過異或高位和低位,減少哈希沖突


7. 經典應用場景
  1. 快速查找

    • 如兩數之和(LeetCode 1)

    
    // 兩數之和解法
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (map.containsKey(complement)) {return new int[]{map.get(complement), i};}map.put(nums[i], i);
    }
  2. 緩存實現(如LRU Cache)

  3. 去重統計(如統計詞頻)


8. 常見面試問題
  • Q1:HashMap如何解決哈希沖突?
    A:鏈地址法(鏈表+紅黑樹)。

  • Q2:為什么負載因子默認是0.75?
    A:空間和時間成本的折中(數學證明較優)。

  • Q3:HashMap為什么線程不安全?
    A:多線程擴容可能導致死循環或數據丟失。


9. 手寫簡易Hashtable(Java示例)

class MyHashtable<K, V> {private Node<K,V>[] table;private int size;private static final int DEFAULT_CAPACITY = 16;static class Node<K,V> {final K key;V value;Node<K,V> next;// 構造方法...}public V put(K key, V value) {int hash = key.hashCode();int index = (table.length - 1) & hash;Node<K,V> node = table[index];while (node != null) {if (node.key.equals(key)) {V oldValue = node.value;node.value = value;return oldValue;}node = node.next;}Node<K,V> newNode = new Node<>(key, value, table[index]);table[index] = newNode;size++;return null;}
}

掌握這些核心知識點后,你就能在面試和實際開發中游刃有余地使用哈希表!

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

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

相關文章

數據流和重定向

1、數據流 不管正確或錯誤的數據都是默認輸出到屏幕上&#xff0c;所以屏幕是混亂的。所以就需要用數據流重定向將這兩 條數據分開。數據流重定向可以將標準輸出和標準錯誤輸出分別傳送到其他的文件或設備去 標準輸入&#xff08;standard input&#xff0c;簡稱stdin&#xff…

詳解 MySQL 索引的最左前綴匹配原則

MySQL 的最左前綴匹配原則主要是針對復合索引&#xff08;也稱為聯合索引&#xff09;而言的。其核心思想是&#xff1a;只有查詢條件中包含索引最左側&#xff08;第一列&#xff09;開始的連續一段列&#xff0c;才能讓 MySQL 有效地利用該索引。 一、 復合索引的結構 復合…

MyBatis注解開發增刪改查基礎篇

本文是MyBatis注解開發的基礎篇&#xff0c;將通過實際場景&#xff0c;詳細介紹MyBatis注解式開發的使用&#xff0c;這是MyBatis很強大的一個特性&#xff0c;可以直接在接口方法上定義 SQL 語句&#xff0c;從而實現數據庫的增刪改查操作。 本文目錄 一、環境依賴二、創建對…

周末總結(2024/04/05)

工作 人際關系核心實踐&#xff1a; 要學會隨時回應別人的善意&#xff0c;執行時間控制在5分鐘以內 堅持每天早會打招呼 遇到接不住的話題時拉低自己&#xff0c;抬高別人(無陰陽氣息) 朋友圈點贊控制在5min以內&#xff0c;職場社交不要放在5min以外 職場的人際關系在面對利…

【HTML】純前端網頁小游戲-戳破彩泡

分享一個簡單有趣的網頁小游戲 - 彩色泡泡爆破。玩家需要點擊屏幕上隨機出現的彩色泡泡來得分。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

如何實現單例模式?

一、模式定義與核心價值 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;保證一個類僅有一個實例&#xff0c;并提供全局訪問點。其核心價值在于&#xff1a; ??資源控制??&#xff1a;避免重復創建消耗性資源&#xff08;如數據庫連…

Three.js 系列專題 1:入門與基礎

什么是 Three.js? Three.js 是一個基于 WebGL 的 JavaScript 庫,它簡化了 3D 圖形編程,讓開發者無需深入了解底層 WebGL API 就能創建復雜的 3D 場景。它廣泛應用于網頁游戲、可視化、虛擬現實等領域。 學習目標 理解 Three.js 的核心組件:場景(Scene)、相機(Camera)…

藍橋云客---藍橋速算

3.藍橋速算【算法賽】 - 藍橋云課 問題描述 藍橋杯大賽最近新增了一項娛樂比賽——口算大賽&#xff0c;目的是測試選手的口算能力。 比賽規則如下&#xff1a; 初始給定一個長度為 N 的數組 A&#xff0c;其中第 i 個數字為 Ai?。隨后數組會被隱藏&#xff0c;并進行 Q 次…

Oracle遷移達夢遇中斷?試試SQLark的斷點續遷功能!

在企業級數據遷移項目中&#xff0c;如果遷移單表數據量超過億行、占用空間超過100GB時&#xff0c;一旦遇到網絡中斷或遷移報錯&#xff0c;往往需要整表重新遷移&#xff0c;導致效率低下&#xff0c;嚴重影響項目進度。針對這一痛點&#xff0c;SQLark 支持對 Oracle→DM 的…

【C/C++算法】藍橋杯之遞歸算法(如何編寫想出遞歸寫法)

緒論&#xff1a;沖擊藍橋杯一起加油&#xff01;&#xff01; 每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; ———————— 早關注不迷路&#xff0c;話不多說安全帶系好&#xff0c;發車啦&am…

[ctfshow web入門] web5

前置知識 引用博客&#xff1a;phps的利用 當服務器配置了 .phps 文件類型時&#xff0c;訪問 .phps 文件會以語法高亮的形式直接顯示 PHP 源代碼&#xff0c;而不是執行它。.phps被作為輔助開發者的一種功能&#xff0c;開發者可以通過網站上訪問xxx.phps直接獲取高亮源代碼 …

day 8 TIM定時器

一、STM32 定時器概述 1. 定時器的概述定時器的基本功能&#xff0c;但是 STM32 的定時器除了具有定時功能之外&#xff0c;也具有定時器中斷功能&#xff0c;還具有輸入捕獲&#xff08;檢測外部信號&#xff09;以及輸出比較功能&#xff08;輸出不同的脈沖&#xff09;&…

Spring Boot 中使用 Redis:從入門到實戰

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

hi3516cv610通過menuconfig關閉的宏記錄

hi3516cv610通過menuconfig關閉的宏記錄 defconfig為 hi3516cv610_debug_defconfig或hi3516cv610_new_defconfig 1、 變為 2、 變為 3、 變為 4、 變為 5、 變為

WebSocket 詳解:構建一個復雜的實時聊天應用

文章目錄 一、前言二、WebSocket 基礎2.1 WebSocket 與 HTTP 的區別2.2 WebSocket 的優點 三、搭建 WebSocket 服務端3.1 安裝 ws 和 redis 庫3.2 創建 WebSocket 服務端3.3 創建用戶身份驗證 四、前端實現 WebSocket 客戶端4.1 創建 Vue 3 項目4.2 實現 WebSocket 連接和用戶注…

【JavaEE進階】Spring AOP入門

歡迎關注個人主頁&#xff1a;逸狼 創造不易&#xff0c;可以點點贊嗎 如有錯誤&#xff0c;歡迎指出~ AOP是Spring框架的第??核?(第??核?是 IoC) 什么是AOP&#xff1f; ? AspectOrientedProgramming&#xff08;?向切?編程&#xff09; 什么是?向切?編程呢? 切…

算法思想之雙指針(一)

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想之雙指針(一) 發布時間&#xff1a;2025.4.4 隸屬專欄&#xff1a;算法 目錄 雙指針算法介紹對撞指針&#xff1a;快慢指針&#xff1a; 例題移動零題目鏈接題目描述算法思路代碼實現 復寫零題目鏈接題目描…

【11408學習記錄】英語寫作黃金模板+語法全解:用FTC數據泄漏案掌握書信結構與長難句拆解(附思維導圖)

2025.04.04 英語寫作書信寫作第一段私人信件公務信函 語法總結——簡單句簡單句的核心&#xff1a;謂語動詞的變化詞性的拓展限定詞 形容詞與副詞介詞短語 成分的擴展同位語插入語 非謂語動詞 每日一句詞匯 第一步&#xff1a;辨別第二步&#xff1a;斷開第三步&#xff1a;簡化…

手機顯示5GA圖標的條件

最近有星友問在什么情況下才能顯示5G-A&#xff1f;雖然這個我也不知道&#xff0c;但是我有幾個運營商的5G終端白皮書&#xff0c;從上面就可以找到答案。 如上是幾個運營商顯示5G-A的條件&#xff0c;基本上考慮的都是3CC的情況&#xff0c;聯通還有考慮200M CA 2CC的場景&am…

網絡:華為數通HCIA學習:IP路由基礎

華為HCIA學習 IP路由基礎路由協議或路由種類以及對應路由的優先級按工作區域分類&#xff1a;按工作機制及算法分類&#xff1a;路由的優先級路由器選擇最優路由的順序是什么? 前言自治系統LAN和廣播域路由選路IP路由表路由度量建立路由表最長匹配原則路由器轉發數據包總結 IP…