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