まず、なぜ必要なのハッシュコード
ハッシュコードは、より効率的にクエリするために、存在しています。あなたが決定する場合、それは非常に遅い場合、いくつかのハッシュコンテナで、またはコンテナ内のオブジェクトのクエリ一部は、あなたが使用等号()定数を比較する必要がありますが、データのわずかに大きい金額のかどうか、
この場合、我々はプロセスを簡略化することができ、各オブジェクトが対応するハッシュコードを有する、ハッシュコードは、第一のプレゼンス等しい()比較の前提と、があるか否かを判定する。だから、それはより効率的に作業することができます。鍵を格納するようにして所定の目標値としてキーとしてハッシュテーブル、ハッシュコードの実際の使用に
次のように示され、その
ハッシュ規定は、ハッシュコード、2つの鍵と値のペアに等しいハッシュ値に等しいです。しかし、ハッシュ値が等しく、必ずしもキーと値のペアが等しい描画しません。(追加された2つの異なるキーと値のペア、ハッシュ衝突で同じハッシュ値を、。)
状態引き付けるだろうそれはそう:等しいを比較すると、その後、彼らのhashCode値も(等しいことを確認する必要があり対等による2つのオブジェクト()メソッドを、これはまた、等号()、ハッシュコードをオーバーライドする必要があります()の理由を書き換えている)が、同じ注意のhashCode、等号は同じではないかもしれません
二、等号のオブジェクト()とhashCode()
1、)(出典に等しいです:
public boolean equals(Object obj) {
return (this == obj);
}
2、ハッシュコード()ソースコード
オブジェクトのハッシュコードがネイティブメソッドである、実施参照、ハッシュコードは、注釈が格納アドレス変換、及びオブジェクト格納アドレス対応ハッシュコードを取得したオブジェクトが返される値であることを特徴とします。
私たちはクラスから生徒を定義すると
student s1= new student("李明");
student s2= new student("李明");
これらの2つが同じ内容が、別の店のアドレスをオブジェクトとしても、ハッシュコードも要件を満たしており、異なっている必要があります
三、equals()とhashCode()リライト
文字列クラスに等しいでは()とhashCode()コード例
1、)(出典に等しいです:
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;
}
リターンアドレスも書き換えられ、位相量戻る真ながら)、同時に、対応するハッシュコード(真されていない見
2、ハッシュコード()コード
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];
//注意:根据string串内容转化hash
}
hash = h;
//目的为再次碰到可直接输出hashcode
}
return h;
}
この両方の文字列の文字列コンテンツ限り、書き換え、同じことが、対応するハッシュコードとして、満足は、所定
第三に、書き換えのequals()hasCodeを書き換えることなく、()の結果
我々は優秀な生徒のクラス、オーバーライドイコール()コンテンツに等しいを作成したとすることは同じですが、以下のコードを実行します
public class HashMapTest {
public static void main(String[] args) {
HashMap<Student, String> map = new HashMap<Student, String>();
// 这里key为new一个对象
map.put(new student("李明"), "1");
String s = map.get( new student("李明"));
System.out.println(s);
}
結果を操作すると、ヌルであり、我々は見つけることができるはずだと思います
これは、私たちは)(等号を書き換えるため、学生はhashCodeメソッドを生成するオブジェクトをオブジェクトのメソッドであるので、オーバーライドされたのhashCode()は、ありませんが、ハッシュコードはアドレスから変換され、2つの新しいうち、なぜ、あります我々はこの問題を解決することができます)hashCodeをオーバーライドします(に必要なので、2つの異なるオブジェクトは、このような結果があります。
)一般的に、あなたは、そのようなマップとして、などをハッシュコンテナを使用しない場合、(等しい)とhashCode()それは問題ではありませんが、あなたはハッシュコンテナを使用している場合、それは(カスタムクラスのequalsに注意を払うことが必要である)とhashCode(