關於HashMap的key重寫hashcode和equals的理解

qq_40629852發表於2019-04-09

關於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

相關文章