日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java – HashMap详细说明

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java – HashMap详细说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HashMap基于哈希算法工作,根據Java文檔HashMap具有以下四個構造函數,

建設者 描述 HashMap ?() HashMap ?(int initialCapacity) HashMap ?(int initialCapacity,
float loadFactor) HashMap ?( Map <? extends K ,? extends V > m)
構造一個空的
具有默認初始容量(16)和默認加載因子(0.75)的HashMap 。
構造一個空的
具有指定初始容量和默認加載因子(0.75)的HashMap 。
構造一個空的
具有指定初始容量和負載因子的HashMap 。
構造一個新的
HashMap具有與指定相同的映射
Map 。

讓我們編寫一個簡單的Java程序,以檢查Map在內部如何工作

  • 創建一個簡單的Map并為其添加一個鍵和值
  • public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "Java");}

    我們剛剛創建了簡單映射,將鍵作為整數,將值作為字符串,并添加了“ 1”作為鍵和“ Java”作為值。 通過使用eclipse調試功能,我們可以查看地圖中的內容

    它創建了16個塊(0-15),并插入了第一個塊,其鍵為整數“ 1”,值為字符串“ Java”。 請選中紅色框,其余所有都用null初始化的框。

    2.將第二個鍵和值添加到同一地圖

    public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "Java");map.put(2, "Angular");}

    讓我們再次在Eclipse調試中查看地圖

    現在,地圖包含了兩個鍵(1,2)和兩個值(“ Java”,“ Angular”),但這些鍵分別分別精確地添加到了第一個塊和第二個塊,為什么?

    因為我們知道Map是基于哈希算法工作的,所以每當我們插入要映射的鍵時,它都會根據hashCode()的值調用Object#hashcode()方法,它將把鍵插入該塊中。

    在上述情況下,Integer類使用其原始int值覆蓋hashCode,這就是為什么(1,java)存儲在第一個塊中,而(2,Angular)存儲在第二個塊中的原因。

    3.讓我們對自己的班級做同樣的實驗

    創建一個簡單的Employee類,如下所示

    private static class Employee{ int id; String name;Employee(int id, String name){ this.id = id; this.name = name; } }

    使用此類作為地圖的鍵并進行相同的檢查

    public static void main(String[] args) { Map<Employee, String> map = new HashMap<>(10); map.put(new Employee(1, "Ramesh"), "Java"); map.put(new Employee(2, "Sathish"), "Angular"); }

    我們添加了兩個鍵作為Employee對象,將Values作為字符串添加,讓我們看看這次存儲在哪個塊中的鍵

    這次,它存儲在第8個塊和第14個塊中(為什么?由于Employee對象的hashCode而給出簡單答案),以確認這一點,讓Employee的hashCode()重寫為常數值并檢查映射。 如果我們的分析正確,則必須將所有密鑰存儲在同一塊中。

    相應地更新Employee類

    private static class Employee{ int id; String name; Employee(int id, String name){ this.id = id; this.name = name; } @Override public int hashCode() { return 10; } }

    我們不需要對地圖進行任何更改,現在讓我們看看密鑰的存儲位置

    是的,只有第10個塊充滿了兩個對象,為什么? 因為兩個雇員對象都返回相同的hashCode(即10)。 但是,Map如何識別這兩個對象不是重復的? 我們從內部知道Map#Key是entrySet(java.util.Set),它調用equals方法來驗證密鑰是否重復。

    同時從Map中檢索值時,首先將檢查給定鍵的hashCode并基于該哈希碼將轉到該塊,在找到該塊之后,它將調用equals()以獲取確切值。

    因此,完全不建議將hashCode()重寫為constant當我們覆蓋hashCode()時,我們也不應忘記覆蓋equals()方法 (即hashCode()/ equals()合約)。

    翻譯自: https://www.javacodegeeks.com/2017/11/java-hashmap-detail-explanation.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Java – HashMap详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。