JAVAの基本 - hashCodeとequalsの関係

等しい

equals() は java.lang.Object から派生したもので、このメソッドは 2 つのオブジェクトが等しいことを単純に検証するために使用されます。Object クラスで定義されたデフォルトの実装は、2 つのオブジェクトのオブジェクト参照をチェックして、それらが等しいことを確認するだけです。このメソッドをオーバーライドすることで、オブジェクトの等価性を検証するための新しいルールをカスタマイズできます。ORM を使用して一部のオブジェクトを処理する場合は、メンバー変数を直接参照するのではなく、hashCode() オブジェクトと equals() オブジェクトでゲッターとセッターを必ず使用してください。

//equals源码
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

ハッシュコード

hashCode() は java.lang.Object から派生し、指定されたオブジェクトの一意の整数 (ハッシュ コード) を取得するために使用されます。この整数は、オブジェクトをハッシュ テーブルなどのデータ構造に保存する必要がある場合に、バケットの場所を決定するために使用されます。デフォルトでは、オブジェクトの hashCode() メソッドは、オブジェクトが配置されているメモリ アドレスの整数表現を返します。hashCode() は、HashTable、HashMap、および HashSet によって使用されます。デフォルトでは、Object クラスの hashCode() メソッドは、このオブジェクトが格納されているメモリ アドレスの番号を返します。

    //hashCode源码
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

ハッシュコードとイコールの関係

次の 2 つの例を見てください。

例 1:

public static void main(String[] args) {
    String a = new String("123");
    String b = new String("123");
    System.out.println(a.hashCode()); //48690
    System.out.println(b.hashCode()); //48690
    System.out.println(a.equals(b));  //true
    System.out.println(a == b);  //false
}

例 2:

この例では hashCode が書き換えられます。
    public static void main(String[] args) {
        class Object1{
            private final int hashCode = 21;
            public int hashCode(){
                return hashCode;
            }
        }
        class Object2{
            private final int hashCode = 21;
            public int hashCode(){
                return hashCode;
            }
        }
        Object1 object1 = new Object1();
        Object2 object2 = new Object2();
        Object1 object3 = new Object1();
        
        System.out.println(object1.hashCode()); //21
        System.out.println(object2.hashCode()); //21
        System.out.println(object3.hashCode()); //21
        System.out.println(object1.hashCode() == object2.hashCode()); //true
        System.out.println(object1.equals(object3)); //false
    }

上記 2 つの例を通して、次の 4 つの点を要約できます。

  1. equals() は、2 つのオブジェクトが等しいかどうかを判断するために使用されます。

  1. hashCode() の機能は、オブジェクトのハッシュ コードを取得することです。ハッシュ コードは通常整数であり、ハッシュ テーブル内のオブジェクトのインデックス位置を決定するために使用されます。たとえば、HashMap は基本的に配列によって実装されるため、特定の「値」を取得したい場合、実際には配列内の特定の位置にある要素を取得する必要があります。配列の位置は「キー」によって取得され、さらに「キー」に対応するハッシュコードによって計算されます。

  1. 2 つのオブジェクトが等しい (等しい) 必要がある場合、それらは同じハッシュ コード (hashCode) を持っている必要があります。

  1. ただし、2 つのオブジェクトが同じハッシュ コードを持つ場合、それらは必ずしも等しいわけではありません (equals メソッドがオーバーライドされると、hashCode メソッドもオーバーライドされる必要があります。hashCode がオーバーライドされない場合は、2 つのオブジェクトが同じデータを指している場合でも、何が等しくないとしても)

以下は、equals() と hashCode() の公式の説明です。

equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれに対して hashCode メソッドを呼び出すと、同じ整数の結果が生成される必要があります。
2 つのオブジェクトが、equals(java.lang.Object) メソッドに従って等しくない場合、2 つのオブジェクトのそれぞれに対して hashCode メソッドを呼び出して、異なる整数の結果を生成する必要はありません。ただし、プログラマは、等しくないオブジェクトに対して異なる整数の結果を生成すると、ハッシュ テーブルのパフォーマンスが向上する可能性があることに注意する必要があります。

おすすめ

転載: blog.csdn.net/DreamEhome/article/details/128817890