まず、基礎となるデータ構造に依存するハッシュシリーズのいくつかを理解します
直列ハッシュデータ構造は、底部にテーブルのそれぞれの位置に割り当てられたハッシュコードインデックスを持つオブジェクトを構築するために使用されます。素子グループインデックスに追加される鎖状構造と同一の構成要素のハッシュ値を持つ場合。
我々はキーインデックスを使用すると、データ構造は、実際にハッシュコードこのキーを取得してから終了するまでのインデックスデータ(チェーン)のインデックスに行くことです。
なぜhashCodeをオーバーライドします
私たちは、それを確実にしたいので、文章、データ構造のHashSetなど(これを回避すべきではありませんほとんどの場合)の一環として、当社のADTにハッシュ値を使用して、デフォルトのハッシュ値を避けるために(デフォルトはアドレス、予測できない)、我々は2つのオブジェクトがトリガー構築ハッシュ構造を使用した後に予測不可能なエラーによって引き起こされる等価矛盾していると判断しました。
、つまり、我々は二つのオブジェクトを考える等しいとき、私たちは彼らのハッシュコードが同じであることを確認しなければならないことを確実にしたいです。
だから、2つのオブジェクトが、自然の中で相当するものが同じハッシュコードを持ち、この原則を満たすために考えられていることを、我々は実行中のプログラムの正しさを保証することができ、私たちのハッシュコードは権利があります。あなたがコーディングマッピングをリセットプライム組み合わせ、または「42」この定数のように、あなただけで直接返すことをするかどうか、つまり、(42は、すべての答えであると主張されている、実験的なガイドブック「DONを組み合わせることは明らかです銀河へ「TのPANIC」、ヒッチハイク・ガイドの著者は、根っからの粉末でなければなりません)私たちの要件に沿ったものです。
ハッシュコードと等価のオブジェクトが等しくなければならない、ハッシュコード非等価好ましくは同じオブジェクト
私たちが作ることができますが、すべての要素が同じハッシュ値を、(彼らは一つの指標で長いチェーンを形成することを)持っているが、これは、様々な特性に大きな影響を与えるだろう。(など、インデックスを追加)
簡単な検証実験
オブジェクトコードは等価ではないため、異なる値を返します。
package P2;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PhoneNumber {
public PhoneNumber(int areaCode,int prefix,int lineNumber){
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNumber = lineNumber;
}
private final int areaCode;
private final int prefix;
private final int lineNumber;
@Override
public int hashCode() {
int[] hashArray = {areaCode, prefix, lineNumber};
return Arrays.hashCode(hashArray);
}
public static void main(String[] args) {
}
}
すべてが戻って、同じ値のコードをオブジェクト
package P2;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PhoneNumber {
public PhoneNumber(int areaCode,int prefix,int lineNumber){
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNumber = lineNumber;
}
private final int areaCode;
private final int prefix;
private final int lineNumber;
@Override
public int hashCode() {
return 42;
}
public static void main(String[] args) {
}
}
テストコード(データ量10000)
package P2;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
public class phoneNumberTest {
@Test(expected = AssertionError.class)
public void testAssertionsEnabled() {
assert false;
}
@Test
public void testRuntime() {
Set<PhoneNumber> set = new HashSet<PhoneNumber>();
for(int i= 0;i<=10000;i++) {
PhoneNumber testNumber = new PhoneNumber(i,i,i);
set.add(testNumber);
}
}
}
テスト結果は、
パフォーマンスに大きな影響を持っている未分化のハッシュコードを返し、見ることができます。
概要
オーバーライドメソッドは(あなたはADTのデフォルトの品質を低下する場合を除き、それはどのような構造のハッシュシリーズの建設に参加しない)オーバーライドハッシュコードを添付しなければならないと等しい場合、ハッシュコードのコードがオブジェクトと等価であることを保証するために、それはその何の同等性を確保しないのがベストですオブジェクトコードは同じではありません。