hashcodeの役割


Hashtable,hashMap,hashSetでは,hashcodeによって,二つのオブジェクトが同じかどうかを決定します。同じ場合は既に存在するオブジェクトをカバーします。
      ですから、クラスを作る時に、equals方法を書き直したら、hashcode方法も必ず書き換えます。hashtable,hashMap,hashSetではequalsによって対象が同一であるかどうかを決めるのではなく、hashcodeによるものです。
      基本的な原則は:もし2つのオブジェクトがequalであれば、彼らのhashcodeも同じであることを保証します。
      これ以外にhashcodeはあまり効果がありません。
 
 例:Student類 , equalsとhashcodeの方法は全部書き換えました。
 
package hashcode;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;

public class Student {

	private int age;
	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * hashcode is used in hashset, hashmap, hashtable. if key's hashcode is the
	 * same, the key will be overided.
	 */
	public int hashCode() {

		return this.age + this.name.hashCode();
	}

	public boolean equals(Object obj) {
		if (obj == null || !(obj instanceof Student)) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		Student s = (Student) obj;
		if (s.getAge() == this.getAge() && s.getName().equals(this.getName())) {
			return true;
		} else {
			return false;
		}
	}

	public Student() {
	}

	public Student(String name, int age) {
		setName(name);
		setAge(age);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Student s1 = new Student("xiaohong", 11);
		Student s2 = new Student("xiaohong", 11);
		System.out.println(s1.hashCode()); //265195626
		System.out.println(s2.hashCode()); //265195626 
		if (s1.equals(s2)) {
			System.out.println("s1 equals s2");//This line prints.
		} else {
			System.out.println("s1 doesn't equal s2");
		}
		HashMap<Student, String> map = new HashMap<Student, String>();
		map.put(s1, "ok");
		map.put(s2, "nok");

		System.out.println(map.get(s1));//"nok", s1 is overided by s2.
		System.out.println(map.get(s2));//"nok"

		Hashtable<Student, String> table = new Hashtable<Student, String>();
		table.put(s1, "ok");
		table.put(s2, "nok");

		System.out.println(map.get(s1));//"nok", s1 is overided by s2.
		System.out.println(map.get(s2));//"nok"

		HashSet<Student> set = new HashSet<Student>();
		Student[] setArray = new Student[2];
		set.add(s1);
		set.add(s2);

		for (Student s : set.toArray(setArray)) {
			if (s != null)
				System.out.println(s.getName() + s.getAge());

		} // print only one element. s1 is overied by s2.

	}

}
 equals方法だけを書き換えて、hashcode方法を書き換えないなら、hashtable、hashSet、hashMapの中で、この二つはもともとequalであるStudentオブジェクトも異なる対象として別々に保存されます。