Javaのhashcodeとequalの方法について

3906 ワード

1、 object 2、equal object , hashcode ; hashcode object , 。 JDK , string, , hashcode equal ( string hashcode)。 3、 , , equal 。  , , map、set。 , hashset , hashmap key 。 , hashcode, hash 。 java , :
1, hashCode
    , ,
    , 2
2, equals
    ,
    ,
,equal hashcode , 。 :

package com.yj.testequal;

public class MyString {
	String mStr;
	int mHashCode;
	
	public MyString(String s, int hashcode) {
		mStr = s;
		mHashCode = hashcode;
	}

	@Override
	public int hashCode() {
		return mHashCode;
	}

	@Override
	public boolean equals(Object obj) {
		if(! (obj instanceof MyString))
			return false;
		return mStr.equals(((MyString)obj).mStr);
	}
	
}

のカスタムクラスはhashcodeとequalをそれぞれ き えます.テスト:
package com.yj.testequal;

import java.util.HashSet;
import java.util.Set;

public class TestEqual {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyString m1 = new MyString("fuck1", 123);
		MyString m2 = new MyString("fuck2", 2344);
		
		System.out.println(m1.hashCode());
		System.out.println(m2.hashCode());
		System.out.println(m1.equals(m2));
		
		MyString m3 = new MyString("fuck12", 123);
		System.out.println(m1.equals(m3));
		Set  sms = new HashSet();
		sms.add(m1);
		sms.add(m2);
		
		if(sms.contains(m3)) {
			System.out.println("contains");
		} else {
			System.out.println("not contains");
		}

	}

}

m 1とm 2をそれぞれ した 、m 3のhashcode り をm 1と じにするか、equal り を で すかにかかわらず、setでは じオブジェクトとは えないオブジェクトm 3を します.hashcodeメソッドとequalメソッドの り が じである にのみ、 じオブジェクトとみなされます.
なぜ の でこのように するのかというと、 の が に きい 、ハッシュ が し、 なるキーが じ き を する があるからです.hashcodeが じならequalの を けましょう.equalメソッドを すると クエリになります.
: なハッシュ はJava SE 5のEnumMapとEnumSetで されています.