hashmap java_Java – HashMap详细说明
hashmap java
HashMap基于哈希算法工作,根據Java文檔HashMap具有以下四個構造函數,
| 構造一個空的 具有默認初始容量(16)和默認加載因子(0.75)的HashMap 。 |
| 構造一個空的 具有指定初始容量和默認加載因子(0.75)的HashMap 。 |
| 構造一個空的 具有指定初始容量和負載因子的HashMap 。 |
| 構造一個新的 HashMap具有與指定相同的映射 Map 。 |
讓我們編寫一個簡單的Java程序,以檢查Map在內部如何工作
我們剛剛創建了簡單映射,該映射將鍵作為整數,將值作為字符串,并添加了“ 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
hashmap java
總結
以上是生活随笔為你收集整理的hashmap java_Java – HashMap详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报告称苹果 iPhone 15 系列面板
- 下一篇: 使用log4j记录日志_使用log4j2