Java HashCode
1.hashCode()は、メソッドを呼び出すオブジェクトのハッシュコード値を返します.このメソッドは、整数形式のハッシュコード値を返します.
objectクラスではhashcode()メソッドがローカルメソッドであり,オブジェクトのアドレス値を返すが,objectクラスでのequals()メソッドの比較も2つのオブジェクトのアドレス値であり,equals()が等しい場合,2つのオブジェクトのアドレス値も等しいことを示し,もちろんhashcode()も等しい.クラスがequals()メソッドを書き換えると、hashCode()メソッドも書き換えられます.
2.java 2つのオブジェクトが等しいか否かを判断するルール まず、2つのオブジェクトのhashCodeが等しいか否かを判断する. 等しくなければ、2つのオブジェクトも等しくないと考えられます. 等しい場合は、2つのオブジェクトがequals演算で等しいか否かを判断する. 等しくなければ、2つのオブジェクトも等しくないと考えられます. 等しい場合は、2つのオブジェクトが等しいとみなされます. クラスのequals()メソッドを書き換えると、hashCode()メソッドも書き換えることを覚えておく必要があります. hashCode()を書き換える方法について説明します.通常hashCode()を書き換える方法は、以下の設計原則に従って実現される.(1)ある非ゼロ素数,例えば17をint型変数resultに保存する.(2)オブジェクト内の各キードメインf(equalsメソッドで考慮される各ドメインを指す)について以下の原則処理を参照する. boolean型、計算(f?0:1). byte,char,short型,計算(int)f. long型,計算(int)(f^(f>>32)). float型、Float.floatToIntBits(f)を計算します. double型、Double.doubleToLongBits(f)を計算して1つのlongを得て、更にlong型の処理を実行します. オブジェクト参照、hashCode()メソッドを再帰的に呼び出します. 配列ドメインは、要素ごとにhashCode()メソッドを呼び出します.(3)上記で計算したハッシュコードをint型変数cに保存し、result=37*result+cを実行します.(4)resultを返します.
3.Stringのhashcodeメソッド
4.Stringのequalsメソッド
objectクラスではhashcode()メソッドがローカルメソッドであり,オブジェクトのアドレス値を返すが,objectクラスでのequals()メソッドの比較も2つのオブジェクトのアドレス値であり,equals()が等しい場合,2つのオブジェクトのアドレス値も等しいことを示し,もちろんhashcode()も等しい.クラスがequals()メソッドを書き換えると、hashCode()メソッドも書き換えられます.
2.java 2つのオブジェクトが等しいか否かを判断するルール まず、2つのオブジェクトのhashCodeが等しいか否かを判断する. 等しくなければ、2つのオブジェクトも等しくないと考えられます. 等しい場合は、2つのオブジェクトがequals演算で等しいか否かを判断する. 等しくなければ、2つのオブジェクトも等しくないと考えられます. 等しい場合は、2つのオブジェクトが等しいとみなされます. クラスのequals()メソッドを書き換えると、hashCode()メソッドも書き換えることを覚えておく必要があります. hashCode()を書き換える方法について説明します.通常hashCode()を書き換える方法は、以下の設計原則に従って実現される.(1)ある非ゼロ素数,例えば17をint型変数resultに保存する.(2)オブジェクト内の各キードメインf(equalsメソッドで考慮される各ドメインを指す)について以下の原則処理を参照する. boolean型、計算(f?0:1). byte,char,short型,計算(int)f. long型,計算(int)(f^(f>>32)). float型、Float.floatToIntBits(f)を計算します. double型、Double.doubleToLongBits(f)を計算して1つのlongを得て、更にlong型の処理を実行します. オブジェクト参照、hashCode()メソッドを再帰的に呼び出します. 配列ドメインは、要素ごとにhashCode()メソッドを呼び出します.(3)上記で計算したハッシュコードをint型変数cに保存し、result=37*result+cを実行します.(4)resultを返します.
3.Stringのhashcodeメソッド
/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
4.Stringのequalsメソッド
/**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
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;
}