equals()とhashcode()の詳細な説明

equals()

これは、他のオブジェクトがオブジェクトと等しいかどうかを判断するために使用されます
。equals()メソッドは、オブジェクトクラスで次のように定義されます。


public boolean equals(Object obj) {  
    return (this == obj);  
}

注意する必要がある:String、Math、Integer、Double、およびその他のカプセル化クラスは、equals()メソッドを使用する場合のオブジェクトクラスのequals()メソッドをカバーしています。
たとえば、文字列クラス


public boolean equals(Object anObject) {  
    if (this == anObject) {  
        return true;  
    }  
    if (anObject instanceof String) {  
        String anotherString = (String)anObject;  
        int n = count;  
        if (n == anotherString.count) {  
            char v1[] = value;  
            char v2[] = anotherString.value;  
            int i = offset;  
            int j = anotherString.offset;  
            while (n– != 0) {  
                if (v1[i++] != v2[j++])  
                    return false;  
            }  
            return true;  
        }  
    }  
    return false;  
} 

ここに画像の説明を挿入

ハッシュコード()

hashCode()メソッドは、ハッシュコード値をオブジェクトに返します。このメソッドは、HashMapなどのハッシュテーブルに使用されます。

まず、hashCodeの役割を理解するには、まずJavaのコレクションを知っている必要があります。一般に、Javaには2つのタイプのコレクションがあります。1つはリストで、もう1つはセットです。それらの違いを知っていますか?前者のセットの要素は順序付けられており、要素を繰り返すことができます。後者の要素は無秩序ですが、要素を繰り返すことはできません。次に、より深刻な問題があります。要素が繰り返されないようにする場合、2つの要素が繰り返されるかどうかを判断するための基礎は何でしょうか。これはObject.equalsメソッドです。ただし、要素を追加するたびにチェックを行うと、要素が多い場合、セットに追加された要素の比較回数が非常に多くなります。つまり、コレクションにすでに1000個の要素がある場合、1001番目の要素がコレクションに追加されると、equalsメソッドが1000回呼び出されます。これは明らかに効率を大幅に低下させます。したがって、Javaはハッシュテーブルの原則を使用します。ハッシュアルゴリズムはハッシュアルゴリズムとも呼ばれ、特定のアルゴリズムに従ってデータをアドレスに直接割り当てます。ハッシュアルゴリズムを詳しく説明すると、記事スペースがもっと必要になるので、ここでは紹介しません。初心者はこの方法を理解できます。hashCodeメソッドは実際にはオブジェクトストレージの物理アドレスを返します(実際にはメモリ内の実際の物理アドレスではありませんが、この方法で理解できます)。このように、新しい要素がコレクションに追加されると、この要素のhashCodeメソッドが最初に呼び出され、配置する必要のある物理的な場所に配置できます。この位置に要素がない場合は、比較せずにこの位置に直接保存できます。この位置にすでに要素がある場合は、equalsメソッドを呼び出して、新しい要素と比較します。同じ場合は、保存されません。同じでない場合は、他のアドレスをハッシュします。したがって、競合解決の問題があります。このようにして、equalsメソッドへの実際の呼び出しの数は大幅に削減され、ほぼ1回または2回だけです。したがって、
JavaではeqaulsメソッドとhashCodeメソッドを次のように規定しています。

1. 2つのオブジェクトが同じである場合、それらのhashCode値は同じである必要があります。

2. 2つのオブジェクトのhashCodeが同じである場合、それらは必ずしも同じではありません。上記の同じオブジェクトは、eqaulsメソッドを使用した比較を指します。もちろん、必要に応じて実行できますが、同じオブジェクトがSetコレクションに表示される場合があります。同時に、新しい要素を追加する効率が大幅に低下します。

equal()メソッドを書き直すと、実際にはオブジェクトではない2つのインスタンスは論理的に等しくなりますが、ハッシュコードは等しくありません。
  
  したがって、ハッシュコードを書き直すことを忘れないでください。
  
  それを書き直さなかった場合の結果は何ですか?もちろん、たとえば、ハッシュマップ、ハッシュテーブル、その他のデザインハッシュコードクラスを使用すると、問題が発生します。
  
  ハッシュコードの書き直し方は、一人一人のスキルによって良い面と悪い面があります。優れたハッシュアルゴリズムを研究している熱心な人々がまだいます。

つまり、Listは順序付けられた繰り返し可能なオブジェクトコンテナインターフェイスであり、Setは順序付けられていない繰り返し不可能なオブジェクトコンテナインターフェイスです。後で、Setが非反復を実現する方法について説明します。equalメソッドの繰り返し使用によるシステム負荷を回避するために、setは最初にhashCodeメソッドを呼び出して、占有されているかどうかを検出します。占有されている場合は、占有されているものが同じであるかどうかを判断するための等しい方法。

Hashset、Hashmap、Hashtable、hashcode()とequals()の間の密接な関係


https://www.cnblogs.com/Qian123/p/5703507.html#_label2に焦点を当てる

おすすめ

転載: blog.csdn.net/weixin_43722571/article/details/99969899