この記事の主な内容は、次のように、Javaのハッシュコードの正しい評価方法です。
オブジェクトのハッシュコードをキャッシュできるハッシュリストの最適化があります。ハッシュコードが一致しない場合、オブジェクトの等価性をチェックせず、それを別のオブジェクトであると直接考慮しません。ハッシュコード(ハッシュコード)が等しい場合、オブジェクトが等しいかどうかを検出します。
オブジェクトに同じハッシュコード(ハッシュコード)がある場合、それらは同じハッシュバケットにマッピングされます。ハッシュリスト内のすべてのオブジェクトのハッシュコードが同じ場合、ハッシュリストはリンクリストに退化し、クエリ効率を大幅に低下させます。
通常、優れたハッシュ関数は、「待機したくないオブジェクトの不均等なハッシュコードを生成する」傾向があります。理想的には、ハッシュ関数は、可能なすべてのハッシュにそれほど存在したくないセットのインスタンスを均等に分配する必要がありますが、この理想的な状況を完全に達成することは非常に困難です。ここに比較的単純で効果的なハッシュメソッドがあります。
1.結果と呼ばれる型intの変数に、17などのゼロ以外の定数値を保存します。
2。オブジェクト内の各キードメインF( Equalsメソッドに関係する各ドメインを参照)について、次の手順を完了します。
result = 31 * result + c;乗算操作は、より良いハッシュ関数を取得することです。たとえば、弦のハッシュ関数が乗算を省略する場合、異なるアルファベット順のすべての文字列に同じハッシュコードがあります。ここで31が選択される理由は、それが奇妙な素数であるためです。乗数が偶数であり、乗算がオーバーフローする場合、2の乗算が変位に相当するため、情報は失われます。素数を使用することの利点は明らかではありませんが、ハッシュの結果は、ハッシュの結果を計算するために従来使用されています。 31には優れた機能があります。つまり、乗算の代わりにシフトと減算を使用して、パフォーマンスを向上させることができます:31 * i ==(i << 5)-i。今日のVMは、この最適化を自動的に実装できます。クラスが不変である場合(すべてのドメインが最終的な変更であり、すべてのドメインが基本タイプであるか、不変クラスである場合)、ハッシュコードの計算のオーバーヘッドも比較的高い場合は、オブジェクト内のハッシュコードのキャッシュを検討する必要があります。
Public Class HashCodedemo {Static Class HashCodeClass {Private Final Boolean Bresult;プライベートファイナルバイトBytevalue;プライベートファイナルチャーバルー。プライベート最終的なショートバリュー。プライベートファイナルイントバリュー。プライベートファイナルロングバリュー。プライベートファイナルフロートフロートバリュー。プライベートファイナルダブル値。プライベートファイナルストリングSTR;プライベートファイナルint [] ArrayValue; //揮発性とは、変数が毎回メモリ内で保存および取得されることを意味し、変数が最新の私的揮発性INTハッシュコードであることを確認します。 public hashcodeclass(){bresult = false; bytevalue = 1; charvalue = 'a'; ShortValue = 1; intvalue = 1; longvalue = 1l; floatvalue = 1.0f; doubleValue = 1.0d; str = getClass()。getName(); arrayvalue = new int [] {1,2,3,4,5}; } @Override public int hashcode(){if(hashcode == 0){//ゼロ以外の初期値を設定して、ゼロドメインの競合を増やすint result = 17; //乗数が省略されている場合、異なるアルファベット順のすべての文字列には同じハッシュコードfinal int hash_code = 31があります。 result = hash_code * result +(bresult?1:0); result = hash_code * result + bytevalue; result = hash_code * result + charvalue; result = hash_code * result + shortValue; result = hash_code * result + intvalue; result = hash_code * result +(int)(longvalue ^(longvalue >>> 32)); result = hash_code * result + float.floattointbits(floatvalue); long doublelongvalue = double.doubletolongbits(doubleValue); result = hash_code * result +(int)(doubleLongValue ^(doubleLongValue >>> 32)); result = hash_code * result +(str == null?0:str.hashcode()); System.out.println( "str =" + str + "、str.hashcode =" + str.hashcode()); result = hash_code * result + arrayvalue.hashcode();返品結果; } HashCodeを返します。 }} public static void main(string [] args){hashcodeclass obj = new hashcodeclass(); system.out.println( "obj.hashcode =" + obj.hashcode()); system.out.println( "obj ="+obj.toString()); }}出力
str = com.demo.test.hashcodemo $ hashcodeclass、str.hashcode = -205823051obj.hashcode = 946611167str = com.demo.test.hashcodemo $ hashcodeclass、 str.hashcode = -205823051obj=com.demo.test.hashcodemo$hashcodeclass@386c23df
要約します
上記は、Javaのハッシュコードの正しい評価方法について議論するこの記事についてのすべてです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!