1、ObjectのHashCode()とequals()
上記のように、
equals()はobjのアドレスを比較している。
hashCode()はnative側で計算している。つまりC/C++側で計算している。
2、StringのHashCode()とequals()
Stringはobjectを継承している。
StringはHashCode()とequals()をオーバーライドしている。
上記equals
1、同じアドレスのobjectなら、true
2、比較文字列のクラスはStringでないなら、false
3、比較文字列のクラスの長さは同じではないなら、false
4、ループで比較、間違いなら、false
5、ループ完了したら、true
3、自前でHashCode()とequals()
private static class Person {
int age;
String name;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + " - " +age;
}
/**
* @desc
*/
@Override
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(this.getClass() != obj.getClass()){
return false;
}
Person person = (Person)obj;
return name.equals(person.name) && age==person.age;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
}
サンプルコード
https://github.com/YanHengGo/java/tree/master/04_hashcode