關於HashMap的key重寫hashcode和equals的理解
關於HashMap的key重寫hashcode和equals的理解
鍵值對儲存在HashMap的Entry連結串列中,連結串列的節點標識為hashcode,每個鍵值對都有一個hashcode(可以重複)。
插入新的鍵值對,查詢是否存在時,為了提升效率,會先計算hashcode,在連結串列上尋找該hashcode的節點,
若無則建立新節點,
若存在,則在該節點上的連結串列**上(拉鍊法)尋找是否有 **equals的,若有equals的則更新值,若無則建立新節點。
所以重寫hashcode、equals,需保證兩種方法的執行結果一致。
反例:euqals為真,但是由於hashcode為假所以判斷為不存在,成功的新增
key.java:
public class key {
String k1;
String k2;
@Override
public int hashCode() {
//return Integer.parseInt(k1)*Integer.parseInt(k2);
return Integer.parseInt(k1)-Integer.parseInt(k2); //若hashcode與equals結果不一致 ,就能插入2個 euqals的鍵值對
}
@Override
public boolean equals(Object obj) {
final key other =(key)obj;
if(this.k1==other.k2||this.k2==other.k1)
return true;
else return false;
}
}
Map m = new HashMap<key,String>();
m.put(new key("1","2"),"value1");
m.put(new key("2","1"),"value2");
Iterator<Map.Entry<key, String >> entries = m.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<key,String> entry = entries.next();
System.out.println(entry.getKey().k1+' '+entry.getKey().k2+' '+entry.getValue());
}
結果
Hello World!
1 2 value1
2 1 value2
相關文章
- 關於重寫equals()和hashCode()的思考
- java~重寫hashcode和equalsJava
- 為什麼重寫 equals() 方法,一定要重寫 hashCode() 呢?| HashMapHashMap
- HashCode 和 Equals 的使用 - 使用自定義物件作為HashMap的Key例子物件HashMap
- 為什麼重寫equals必須重寫hashCode
- 關於equals()和hashcode()的一些約定
- java為什麼要重寫hashCode和equals方法Java
- 重寫Object.equals()方法和Object.hashCode()方法Object
- 重寫equals()方法時,需要同時重寫hashCode()方法
- MapReduce關於key的定義、hashCode()、equals(Object obj)、compareTo(CustomCombineKey other)Object
- java 中為什麼重寫 equals 後需要重寫 hashCodeJava
- 重寫equals()時為什麼也得重寫hashCode()之深度解讀equals方法與hashCode方法淵源
- 建議重寫equals方法時也一併重寫hashCode方法
- Java重寫equals方法時為什麼要重寫hashcode方法Java
- 『Java 語法基礎』對 equals() 和 hashCode() 的理解Java
- equals()和hashCode()的區別
- String的equals和hashCode方法
- equals與hashCode關係梳理
- equals & hashCode
- Java基礎- ==和equals和hashCode的區別Java
- hashCode()和equals()的區別?(skycto JEEditor)
- hashcode重寫
- 搞懂 Java equals 和 hashCode 方法Java
- equals&hashCode
- hashCode()與equals()
- 從語言設計的角度探究Java中hashCode()和equals()的關係Java
- JAVA基礎(一)equals和==和hashCodeJava
- HashSet中重寫haseCode和equals
- 細說equals()方法和hashCode()方法
- 詳解equals()方法和hashCode()方法
- 自動生成hashcode和equals方法
- “==”、“equals()”、“hashcode()”之間的祕密
- Hashcode相同但是equals不同的例子
- ==、equals、hashcode總結
- Object類-equals()、==、hashCode()Object
- 關於HashMap和Hashtable的區別HashMap
- 面試官愛問的equals與hashCode面試
- 物件只定義了Equals和Hashcode方法之一的漏洞物件