首頁  >  文章  >  Java  >  Java中hashCode方法怎麼用

Java中hashCode方法怎麼用

WBOY
WBOY轉載
2023-05-11 13:49:061756瀏覽

1、介紹一下hashCode方法

  • hashCode() 的作用是取得雜湊碼,也稱為雜湊碼,它實際上是返回一個int整數。這個雜湊碼的作用是確定該物件在雜湊表中的索引位置。

  • hashCode() 定義在JDK的Object.java中,這表示Java中的任何類別都包含有hashCode() 函數。

  • 散列表儲存的是鍵值對(key-value),它的特性是:能根據「鍵」快速的檢索出對應的「值」。這其中就利用到散列碼了! (可以快速找到所需要的物件)。

2、為什麼需要hashCode方法?

在我們寫程式的過程中,判斷兩個物件是否相同是十分常見且經常面對的一個問題。而 hashCode() 方法就是用來提升比較兩個物件的速度的。

我們就以「HashSet 如何檢查重複」為例子來說明為什麼要有hashCode:

  • 當你把物件加入HashSet 時, HashSet 會先計算物件的hashcode 值來判斷物件加入的位置,同時也會與其他已加入的物件的hashcode 值進行比較,如果沒有相符的hashcode HashSet 會假設物件沒有重複出現。

  • 但如果發現有相同hashcode 值的對象,這時會呼叫equals()方法來檢查hashcode 相等的物件是否真的相同。如果兩者相同, HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。

  • 這樣我們就大大減少了 equals 的次數,對應就大大提高了執行速度。

3、hashCode(),equals()兩種方法是什麼關係?

Java 對於eqauls() 方法和hashCode() 方法是這樣規定的:

  • 在同一物件上多次呼叫hashCode() 方法,總是傳回相同的整數值。

  • 如果 a.equals(b),則一定有 a.hashCode() 一定等於 b.hashCode()。

  • 如果 !a.equals(b),則 a.hashCode() 不一定等於 b.hashCode()。此時如果 a.hashCode() 總是不等於 b.hashCode(),會提升 hashtables 的效能。

  • a.hashCode()==b.hashCode() 則a.equals(b) 可真可假

  • a.hashCode ()! = b.hashCode() 則 a.equals(b) 為假。

上面結論簡記:

  • 如果兩個物件 equals,Java 執行環境會認為他們的 hashCode 一定相等。

  • 如果兩個物件不 equals,他們的 hashCode 有可能相等。

  • 如果兩個物件 hashCode 相等,他們不一定 equals。

  • 如果兩個物件 hashCode 不相等,他們一定不是 equals。

4、為什麼要重寫 equals 方法必須重寫 hashcode 方法 ?

  • 我們上面講解到 如果 兩個物件 equals 的話,那麼它們的 hashCode 值必然相等。如果只重寫了equals 方法,而不重寫hashCode 的方法,會造成hashCode 的值不同,而equals 方法判斷出來的結果為true

  • 在Java中的某些容器中,不允許有兩個完全相同的對象,插入的時候,如果判斷相同則會被覆蓋。這時候如果只重寫了equals 的方法,而不重寫hashCode 的方法,Object中hashCode 是根據物件的儲存位址轉換而形成的一個哈希值。這時候就有可能因為沒有重寫 hashCode 方法,造成相同的物件雜湊到不同的位置而造成物件的不能覆蓋的問題。

例如

Dog類別

package com.xiao;

/**
 * @author :小肖
 * @date :Created in 2022/3/11 14:42
 */
public class Dog {

    private String name;

    private Integer age;


    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        if(obj.getClass() != getClass()){
            return false;
        }
        Dog dog = (Dog) obj;
        if(dog.getAge() == age && dog.getName().equals(name)){
            return true;
        }
        return false;
    }
}

測試類別

import com.xiao.Dog;

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog("小旺",2);
        Dog dog1 = new Dog("小旺",2);
        System.out.println("equals结果:" + dog.equals(dog1));
        System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
    }
}

測試結果

equals結果:true
dog 的hashCode 值是否等於dog1 的hashCode 值:false

以上是Java中hashCode方法怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除