序文
誰もが知っているように、java.lang.objectにはハッシュコード()とequals()メソッドがあり、ソフトウェア設計で重要な役割を果たします。いくつかの重要な機能を達成するために、これらの2つの方法をいくつかのクラスで書き直します。
1.なぜhashcode()を使用するのですか?
セットの要素は障害であり、抑制されません。では、2つの要素が繰り返されるかどうかを判断するための根拠は何ですか?
一部の人々は、 Object.equal()もちろん、オブジェクトが等しいかどうかを比較するために使用されます。ただし、セットには多数のオブジェクトがあり、セットに追加されたオブジェクト要素の比較数が徐々に増加し、プログラム操作の効率が大幅に低下します。 Javaは、ハッシュアルゴリズム(ハッシュアルゴリズムとも呼ばれます)を使用して、この問題を解決します。オブジェクト(またはデータ)は、特定のアルゴリズムに従ってアドレスに直接マッピングされ、オブジェクトのアクセス効率が大幅に改善されます。
このようにして、多数の要素を含むセットが要素(オブジェクト)を追加する必要がある場合、最初にこの要素のハッシュコード()を呼び出し、この要素の実際のストレージ位置を一度に配置できます。この位置に要素がない場合、このオブジェクトはコレクションセットに初めて保存され、オブジェクトはこの位置に直接保存されます。この位置にオブジェクトがある場合は、Equal()を呼び出して、2つのオブジェクトが等しいかどうかを確認します。同じことが真の場合、要素を破棄し、存在しません。等しくない場合は、他のアドレスにハッシュします。
これが、セットがオブジェクトタイプデータを保存する場合、オブジェクトのハッシュコード()メソッドを書き換えるだけでなく、equals()メソッドを書き換える必要がある理由でもあります。
2。HashCode()の使用方法
hashcode()とequals()の返品値の関係
これが例です。実際のソフトウェア開発では、これら2つの方法を書き直すことが最善です。
パブリッククラスの従業員{int EmployeeID;文字列名; @Override public boolean equals(object obj){if(obj == this)return true;従業員emp =(従業員)obj; if(employeed.equals(emp.getemployeeid())&& name == emp.getname())return true; falseを返します。 } @Override public int hashcode(){int hash = 1;ハッシュ=ハッシュ * 17 + EmployeeID; hash = hash * 31 + name.hashcode();ハッシュを返します。 }}equals()およびhashcode()メソッドは、同じクラスで同じクラスオブジェクトをコンテナに保存する場合、同じクラスに設定するなどのコンテナに同じクラスオブジェクトを保存する場合、同じクラスで比較するために使用されます。
ここでは、最初に問題を理解する必要があります。
equals()equalsを持つ2つのオブジェクト、HashCode()は等しく、Equals()を持つ2つのオブジェクトは等しくなく、HashCode()が等しくないことを証明できません。言い換えれば、equals()メソッドが等しくない2つのオブジェクトの場合、HashCode()は等しい場合があります。
ここで、ハッシュコードは辞書の各文字のインデックスに似ており、equals()は、辞書の同じ文字の下の異なる単語を比較するようなものです。辞書のように、辞書の「自己」という単語の下で「自己」と「自発的」を検索すると、equals()を使用して単語クエリの等式を決定する場合、それは同じ単語です。たとえば、equals()で比較された2つの単語は「self」であり、Hashcode()メソッドによって取得された値は現時点で等しくなければなりません。 equals()メソッドが「自己」と「自発的」という単語を比較する場合、結果はあなたが待ちたくないが、これらの単語は両方とも「自己」という言葉に属し、インデックスを検索するとき、つまり、ハッシュコード()は同じです。 equals()が「自己」と「彼ら」という単語を比較する場合、結果も異なり、HashCode()によって得られた結果も現時点で異なります。
逆に:hashcode()は異なり、equals()を導入できます。 HashCode()は等しく、等しい()は等しい場合があるか、等しくない場合があります。
オブジェクトクラスでは、HashCode()メソッドはローカルメソッドであり、オブジェクトのアドレス値を返します。オブジェクトクラスのequals()メソッドは、2つのオブジェクトのアドレス値も比較します。 equals()が等しい場合、2つのオブジェクトのアドレス値も等しいことを意味します。もちろん、HashCode()は等しいです。
Equalsは等しい要素を比較する方が正確であるため、Hashcode()メソッドを使用する理由は何ですか?
ハッシュアルゴリズムは、要素を見つけるのに高い効率を提供するため、コレクションにオブジェクトが含まれているかどうか、おおよそのプログラムコードの書き方を見つけたい場合は?
通常、探しているオブジェクトと比較するために、各要素を1つずつ取り出します。要素と探しているオブジェクトとの等しいメソッド比較の結果が見つかった場合は、検索を停止し、肯定的な情報を返します。それ以外の場合は、否定的な情報を返します。コレクションには、10,000個の要素などの多くの要素があり、探しているオブジェクトが含まれていない場合、プログラムはコレクションから10,000個の要素を取り出し、結論を出すために1つずつ比較する必要があることを意味します。
オブジェクトクラスは、各Javaオブジェクトのハッシュコードを返すためのHashCode()メソッドを定義します。ハッシュセットコレクションのオブジェクトを探しているとき、Javaシステムは最初にオブジェクトのハッシュコード()メソッドを呼び出してオブジェクトのハッシュコードテーブルを取得し、ハッシュに基づいて対応するストレージ領域を見つけ、最後にストレージ領域の各要素を取得し、equalsメソッドのオブジェクトと比較します。このようにして、コレクション内のすべての要素を横断せずに結論を得ることができます。ハッシュセットコレクションには、オブジェクトの検索パフォーマンスが優れていることがわかります。
ただし、ハッシュセットコレクションにオブジェクトを保存する効率は比較的低いです。これは、ハッシュセットコレクションにオブジェクトを追加する場合、オブジェクトのハッシュコードを最初に計算する必要があり、コレクション内のオブジェクトのストレージ位置はこのハッシュコードに基づいて決定されるためです。クラスのインスタンスオブジェクトをハッシュセットに正常に保存できるようにするために、このクラスの2つのインスタンスオブジェクトの結果は、equals()メソッドと比較した場合、等しくなければなりません。つまり、 obj1.equals(obj2)の結果が真である場合、次の式の結果もtrue:obj1.hashCode() == obj2.hashCode() 。
言い換えれば、オブジェクトの等しい方法を書き直す場合、ハッシュコードメソッドを書き換える必要があります。ハッシュコードメソッドを書き換えない場合、オブジェクトオブジェクトのハッシュコードメソッドは常にオブジェクトのハッシュアドレスを返し、このアドレスは決して等しくありません。したがって、この時点でequalsメソッドが書き換えられたとしても、ハッシュコードメソッドが待機したくない場合、比較のために等しい方法を呼び出さないため、無意味です。
ほとんどのデータ構造は、Equalsメソッドを使用して、要素が含まれているかどうかを判断します。たとえば、:
List <String> list = arrays.Aslist( "a"、 "b"、 "c"); boolean contains = list.contains( "b");
この変数には結果が含まれます。「B」は異なるインスタンス(さらに、文字列のレジデンシーは無視されます)が等しいためです。
インスタンスに含まれる各要素を比較する代わりに、迅速な方法を使用して、潜在的なインスタンスの平等を削減します)。クイック比較では、次の側面を比較する必要があります。
ショートカットの比較とは、ハッシュ値を比較することにより、インスタンスを整数値に置き換えることができることを意味します。同じハッシュコードを持つインスタンスは必ずしも等しいとは限りませんが、平等のインスタンスは同じハッシュ値を持つ必要があります。 (または、これについて説明する必要があります)これらのデータ構造は、この手法によってしばしば名前が付けられており、Hashmapが最も有名な代表者であるHashで識別できます。
彼らは通常このように働きます:
要素を追加するとき、そのハッシュコードは、内部配列のインデックス(つまり、いわゆるバケット)を計算するために使用されます
はい、不均等な要素に同じハッシュコードがある場合、それらは同じバケツに上がり、たとえばリストに追加することで一緒にバンドルされます。
インスタンスが操作が含まれる場合、ハッシュコードを使用してバケット値(インデックス値)を計算し、インスタンスは、対応するインデックス値に要素が存在する場合にのみ比較されます。
したがって、ハッシュコードはオブジェクトクラスで定義されます。
ハッシュコードが平等を決定するためのショートカットとして使用される場合、気にする必要があるものは1つだけです。等しいオブジェクトには同じハッシュコードが必要な場合があります。そのため、equalsメソッドをオーバーライドする場合、それに一致するハッシュコード実装を作成する必要があります。
それ以外の場合、等しいオブジェクトには、オブジェクトのデフォルトの実装を呼び出すため、同じハッシュコードがない場合があります。
公式文書からの引用
ハッシュコード一般大会:
Javaアプリケーションで実行されている同じオブジェクトを呼び出す場合、ハッシュコードメソッドは常に同じ整数を返す必要があります。この整数は、異なるJavaアプリケーション間で一貫性を保つ必要はありません。 equals(Object)メソッドによれば、2つのオブジェクトが等しい場合、2つのオブジェクトがHashCodeメソッドを呼び出すと同じ結果を生成する必要があります。
equals(Object)メソッドによると、2つのオブジェクトが等しくない場合、HashCodeメソッドを呼び出すと、必ずしも異なる整数結果が生成されません。ただし、プログラマーは、不均等なオブジェクトの異なる整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性が高いことを認識する必要があります。
ハッシュコードの実装
person.hashcode()の簡単な実装です。
@overridepublic int hashcode(){return objects.hash(firstName、lastName);}人は、複数のフィールドを組み合わせてハッシュコードを計算します。すべてはオブジェクトのハッシュ関数によって計算されます。
フィールドを選択します
しかし、どのフィールドが関連していますか?要件は、この質問に答えるのに役立ちます。
等しいオブジェクトに同じハッシュコードが必要な場合、計算されたハッシュコードには、等式チェックに使用されないフィールドを含めるべきではありません。 (それ以外の場合、2つのオブジェクトは、これらのフィールドが異なることですが、それでも等しいかもしれませんが、2つのオブジェクトのハッシュコードは現時点では異なります。)したがって、ハッシュグループフィールドが等しい場合に使用されるフィールドのサブセットは等しくなければなりません。デフォルトでは同じフィールドが使用されていますが、考慮すべき詳細がいくつかあります。
要約します
ハッシュコードを計算することは、等しい整数値を圧縮することであることを理解しています。等しいオブジェクトには同じハッシュコードが必要であり、パフォーマンスの考慮事項のために、同じハッシュコードをできるだけ少ない不平等オブジェクトを共有することをお勧めします。
これは、等しいメソッドが書き換えられた場合、ハッシュコードメソッドを書き直す必要があることを意味します。
HashCodeを実装する場合、Equals(またはEqualsで使用されるフィールドのサブセット)で使用されるのと同じフィールドを使用する
可変フィールドを含めないことをお勧めします。コレクションのハッシュコードを呼び出すことを検討しないでください。特別な入力固有モードがない場合は、一般的なハッシュアルゴリズムを使用してみてください。
さて、上記はこの記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。