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メソッド
/**
     * 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;
    }