學習Java中HashMap的使用

HashMap是Java中最常用的Map介面的實現之一。它提供了一種快速的查找方式,並且插入和刪除操作也比較高效。HashMap的內部實現是基於哈希表,它將鍵值對映射到一個固定長度的數組中。當需要查找一個特定的鍵值對時,首先需要計算哈希碼,然後定位到對應的桶(bucket),最後在桶中查找對應的值。

一、HashMap簡介

HashMap是Java中最常用的Map介面的實現之一。它允許存儲鍵值對,並且用Key來取得Value,Key在HashMap中必須是獨一無二的,Value則可以重複。Key和Value都可以為null。

HashMap的實現方法是採用哈希表,它是將Key映射到一個固定長度的數組中,這個數組就是哈希表的主空間。當需要查找一個特定的鍵值對時,首先需要計算哈希碼,然後定位到對應的桶(bucket),最後在桶中查找對應的值。因為哈希碼的範圍往往大於數組的長度,所以可能會出現不同的鍵值對具有相同的哈希碼的情況,這就是哈希衝突,HashMap使用鏈表來解決這個問題,即如果兩個鍵值對具有相同的哈希碼,就將它們存儲在同一個桶中的鏈表中。

二、HashMap的常用操作

1. 創建HashMap

創建一個HashMap可以通過默認構造函數或者帶有初始容量和負載因子的構造函數實現。如果不指定初始容量和負載因子,則使用默認值(初始容量為16,負載因子為0.75)。

    Map<String,Integer> hashMap = new HashMap<>();
    Map<String,Integer> hashMap = new HashMap<>(20);
    Map<String,Integer> hashMap = new HashMap<>(20, 0.8f);

2. 添加鍵值對

在HashMap中添加鍵值對可以使用put()方法。如果新的鍵值對的鍵已經存在,則會用新的值覆蓋原有的值。

    Map<String,Integer> hashMap = new HashMap<>();
    hashMap.put("apple", 10);
    hashMap.put("orange", 20);
    hashMap.put("banana", 30);

3. 獲取值

使用get()方法可以獲取HashMap中指定鍵對應的值,如果鍵不存在,就返回null。

    Map<String,Integer> hashMap = new HashMap<>();
    hashMap.put("apple", 10);
    Integer value = hashMap.get("apple");
    System.out.println(value);  // 輸出:10

4. 移除鍵值對

可以使用remove()方法來移除HashMap中指定鍵對應的鍵值對,如果鍵不存在,就不會有任何影響。

    Map<String,Integer> hashMap = new HashMap<>();
    hashMap.put("apple", 10);
    hashMap.put("orange", 20);
    hashMap.put("banana", 30);
    hashMap.remove("orange");

5. 判斷鍵是否存在

可以使用containsKey()方法來判斷HashMap中是否包含指定的鍵。

    Map<String,Integer> hashMap = new HashMap<>();
    hashMap.put("apple", 10);
    boolean contains = hashMap.containsKey("apple");
    System.out.println(contains);  // 輸出:true

三、HashMap的使用

1. 存儲學生成績

以下是一個示例代碼,用HashMap存儲學生成績。

    Map<String,Double> scoreMap = new HashMap<>();
    scoreMap.put("張三", 80.5);
    scoreMap.put("李四", 90.0);
    scoreMap.put("王五", 70.5);
    scoreMap.put("趙六", 95.0);
    System.out.println("張三的成績是" + scoreMap.get("張三"));

輸出結果為:

    張三的成績是80.5

2. 統計單詞出現的次數

以下是一個示例代碼,用HashMap統計一段英文文本中每個單詞出現的次數。

    String text = "Good morning. Have a good class. Have a good visit. Have fun!";
    String[] words = text.toLowerCase().split("[^a-zA-Z]+");
    Map<String,Integer> wordCountMap = new HashMap<>();
    for (String word : words) {
        if (wordCountMap.containsKey(word)) {
            wordCountMap.put(word, wordCountMap.get(word) + 1);
        } else {
            wordCountMap.put(word, 1);
        }
    }
    for (Map.Entry<String,Integer> entry : wordCountMap.entrySet()) {
        System.out.println(entry.getKey() + "出現了" + entry.getValue() + "次");
    }

輸出結果為:

    a出現了3次
    class出現了1次
    fun出現了1次
    good出現了3次
    have出現了3次
    morning出現了1次
    visit出現了1次

3. 實現LRU緩存

以下是一個示例代碼,用HashMap實現一個LRU(least recently used)緩存,其中最多存儲10個鍵值對,並且當緩存滿時,清除最近最少使用的鍵值對。

    class LRUMap<K,V> extends LinkedHashMap<K,V> {
        private final int maxSize;

        public LRUMap(int maxSize) {
            super(maxSize + 1, 1.0f, true);
            this.maxSize = maxSize;
        }

        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > maxSize;
        }
    }

    public static void main(String[] args) {
        Map<Integer,Integer> map = new LRUMap<>(10);
        for (int i = 0; i < 20; i++) {
            map.put(i, i);
            System.out.println("插入鍵" + i + ",當前map:" + map);
        }
    }

輸出結果為:

    插入鍵0,當前map:{0=0}
    插入鍵1,當前map:{0=0, 1=1}
    插入鍵2,當前map:{0=0, 1=1, 2=2}
    插入鍵3,當前map:{0=0, 1=1, 2=2, 3=3}
    插入鍵4,當前map:{0=0, 1=1, 2=2, 3=3, 4=4}
    插入鍵5,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5}
    插入鍵6,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6}
    插入鍵7,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7}
    插入鍵8,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8}
    插入鍵9,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
    插入鍵10,當前map:{1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10}
    插入鍵11,當前map:{2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11}
    插入鍵12,當前map:{3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12}
    插入鍵13,當前map:{4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13}
    插入鍵14,當前map:{5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14}
    插入鍵15,當前map:{6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15}
    插入鍵16,當前map:{7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16}
    插入鍵17,當前map:{8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17}
    插入鍵18,當前map:{9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18}
    插入鍵19,當前map:{10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18, 19=19}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192884.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 10:30
下一篇 2024-12-01 10:31

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論