手寫HashMap

在Java中,HashMap是一種散列表,它存儲鍵值對,並可以通過鍵進行快速檢索。HashMap同樣也是我們日常開發中使用非常廣泛的數據結構之一,因此,了解HashMap的工作原理及手動實現HashMap是我們開發Java應用程序的必備技能之一。本文將會從多個方面對手寫HashMap進行詳細闡述,幫助讀者全面了解HashMap的運作原理及具體實現。

一、HashMap的概述

HashMap是一個散列表,它是Java Collection Framework中的一部分。HashMap以鍵值對(Key-Value Pairs)的形式存儲數據,Key可以通過hashCode()方法被哈希為一個整數,並被哈希表作為索引來保存數據的地址

HashMap的作用就是能夠在O(1)的時間複雜度內實現增刪改查。其中,增加操作put(),刪除操作remove(),獲取操作get(),都可以通過鍵直接進行訪問,極大的提高了我們的開發效率。

二、HashMap的實現原理

HashMap的實現原理主要基於哈希表,每個元素都以Key-Value的形式保存在一個桶(bucket)中。當進行查找操作時,首先根據Key哈希為一個整數,然後根據這個整數映射到桶中,從而找到Key所在的位置。

一、哈希函數

哈希函數是HashMap中的一個重要概念,哈希函數將傳入的Key轉換為一個哈希碼(hashCode),通過哈希碼在底層數組中進行查找。哈希函數映射的哈希碼越分布越均勻,則衝突的概率也就越小,HashMap的效率也就越高。


public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

我們可以看到,hashCode()函數返回一個int類型的哈希碼,這個哈希碼由Java提供的一個特定的公式生成,該公式的目的是讓生成的哈希碼分布得越均勻越好。

二、哈希衝突的解決方法

當不同的Key通過哈希函數產生的哈希碼相同時,就會發生哈希衝突。哈希衝突時,需要使用鏈表或紅黑樹等數據結構來解決,這也是HashMap為什麼能夠在時間複雜度為O(1)內實現高效增刪改查的原因。

HashMap中鏈表的長度閾值為8,如果同一個桶內鏈表長度超過了8,則該鏈表會轉換為紅黑樹,以提高查找效率。如果刪除元素後,鏈表長度小於等於6,則將紅黑樹轉換為鏈表。

三、手寫HashMap的實現

為了直觀地展示HashMap的工作原理,我們接下來將手動實現一個簡單的HashMap。

一、初始化HashMap

我們首先定義一個簡單的HashMap類,它包含一個Node數組和一個長度變量size:


public class MyHashMap {
    private Node[] arr;
    private int size;
}

在構造函數中,我們需要對Node數組進行初始化,這裡我們設置數組大小為10:


public MyHashMap() {
    arr = new Node[10];
}

二、實現put方法

put方法是向HashMap中添加Key-Value對的方法。我們需要通過Key的哈希值來確定該元素在Node數組中的位置,並且,當哈希衝突時,需要使用鏈表將其保存。put方法的實現過程如下:


public void put(int key, int value) {
    int index = key % arr.length;

    if (arr[index] == null) {
        arr[index] = new Node(key, value);
        size++;
    } else {
        Node node = arr[index];

        while (node.next != null) {
            if (node.next.key == key) {
                node.next.value = value;
                return;
            }
            node = node.next;
        }

        if (node.key == key) {
            node.value = value;
        } else {
            node.next = new Node(key, value);
            size++;
        }
    }
}

可以看到,我們首先通過Key計算出其哈希值,然後用哈希值來確定該key在Node數組中的位置。如果該位置為空,則直接在該位置插入一個新的Node,如果該位置不為空,則需要遍歷鏈表來查找該Key,如果找到,則更新其Value值,否則,在該鏈表尾部添加一個新的Node節點。

三、實現get方法

get方法是獲取HashMap中指定Key對應的Value值的方法。與put方法類似,get方法也需要通過Key的哈希值來確定該元素在Node數組中的位置。get方法的實現過程如下:


public int get(int key) {
    int index = key % arr.length;
    Node node = arr[index];

    while (node != null) {
        if (node.key == key) {
            return node.value;
        }
        node = node.next;
    }

    return -1;
}

可以看到,我們通過Key計算出其哈希值,然後用哈希值來確定該key在Node數組中的位置。如果該位置為空,則該Key不存在於HashMap中,返回-1;否則,遍歷鏈表來查找該Key,如果找到,則返回對應的Value值。

四、HashMap的使用

手寫的MyHashMap雖然不如Java原生的HashMap強大,但是其原理和簡潔的代碼十分直觀,值得用於學習和理解HashMap的工作原理。下面我們來看一下如何使用Java原生的HashMap:


HashMap<String, String> map = new HashMap<>();
map.put("Key1", "Value1");
map.put("Key2", "Value2);

String value1 = map.get("Key1");
String value2 = map.get("Key2");

如上述代碼所示,我們可以輕鬆地使用Java原生的HashMap進行操作,並可以在一次代碼調用中實現快速地增刪改查。

總結

本文以手寫HashMap為中心,詳細介紹了HashMap的工作原理及具體實現。HashMap作為一個重要的數據結構,能夠在Java開發中發揮重要作用。如果不僅限於Java開發,類似HashMap的數據結構在其他領域同樣具有重要的意義。了解HashMap以及其他相關數據結構的工作原理及實現,將有助於我們更好地理解算法原理,提高開發效率。

原創文章,作者:JKNNW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332767.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JKNNW的頭像JKNNW
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相關推薦

  • 深度解析hashmap負載因子

    hashmap是一個非常常見的數據結構之一,它具有快速的查找和插入操作。負載因子是hashmap中非常重要的一個概念,本文將從多個方面深度解析hashmap負載因子的含義、計算方法…

    編程 2025-02-25
  • Java中HashMap的遍歷方法

    一、基本介紹 HashMap是Java中十分常用的一種數據結構,在開發和實際應用中也頻繁使用。HashMap是一種基於哈希表的Map接口實現,它允許null值和null鍵,同時它也…

    編程 2025-02-24
  • Java HashMap遍歷

    一、HashMap簡介 HashMap是Java中的常用集合類,它實現了Map接口,提供了基於鍵值對的存儲和檢索功能。HashMap允許鍵和值都可以為空,而且是非線程安全的。 二、…

    編程 2025-02-01
  • 基於HashMap.get實現的Java工程師

    引言 HashMap是Java中最常使用的數據結構之一,其實現方式為哈希表(hash table),可以很快地將大量數據進行管理和查找。對於Java工程師而言,HashMap是必須…

    編程 2025-01-16
  • HashMap遍歷詳解

    一、HashMap遍歷代碼 HashMap是一種常用的數據結構,它提供了一個鍵值對應的映射關係。在Java中,遍歷HashMap可以採用多種方式,其中最基本的方式是使用迭代器和fo…

    編程 2025-01-14
  • HashMap的put方法實現機制

    一、HashMap簡介 HashMap是一個常用的數據結構,它實現了一個鍵值對映射的哈希表。它通過將鍵映射到bucket中,來實現快速的查找。HashMap中每個bucket會保存…

    編程 2025-01-13
  • Java HashMap指南

    一、HashMap入門 Java中的HashMap是一種常見的數據結構,可以用於在鍵值對的基礎上快速存儲、檢索和刪除數據。它可以通過鍵來訪問元素,而不是通過位置。 使用HashMa…

    編程 2025-01-11
  • Java遍歷HashMap示例

    引言 HashMap是Java中非常常用的集合類,其支持將鍵映射到值的存儲方式,可以方便地進行查找、插入和刪除操作。在實際開發中,我們經常需要對HashMap進行遍歷操作。本文將介…

    編程 2025-01-11
  • 如何使用HashMap修改value值

    在Java開發中,HashMap是經常用到的一種數據結構,它提供了一種快速的存儲和檢索鍵/值對的方法。但是,在實際應用中,時常需要修改HashMap中的value值,本文將從多個方…

    編程 2025-01-09
  • Java中HashMap的使用和原理

    HashMap是Java中最常用的數據結構之一,它是一種以Key-Value形式存儲數據的哈希表。在本篇文章中,我們將從各個方面詳細闡述Java中HashMap的使用和原理。 一、…

    編程 2025-01-07

發表回復

登錄後才能評論