- HashCode的介绍
哈希码是按照某种规则生成的int类型的数值
哈希码并不是完全唯一的。
- 规范1
若重写了某个类的equals方法,请一定重写hashCode方法,要保证”若两个对象相等,其hashCode一定相同”始终成立;
- 规范2
若equals方法返回false,即两个对象不相等,并不要求这两个对象的hashCode得到不同的数;
- 推论
两个对象相等,其HashCode一定相同;
两个对象不相等,其HashCode有可能相同;
HashCode相同的两个对象,不一定相等;
HashCode不相同的两个对象,一定不相等;
这个只是规范,违反并不会造成编译或运行时的错误,但会在存储一些集合中时造成潜在的bug,因为有些集合会首先根据hashCode来判断是否重复。
- HashCode的意义
HashMap插入重复的key,HashSet插入重复的value,怎么来判断重复呢?他们判断两个对象是否相等的规则是:
1)首先判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
2)判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
class Person{
private String name;
private String sex;
public Person(String name, String sex){
if (name != null && sex != null) {
this.name = name;
this.sex = sex;
}
}
public void print(){
System.out.println(name + " " + sex);
}
public boolean equals(Object object){
if (object instanceof Person) {
Person person = (Person)object;
if (this == person) {
return true;
}else if (person.getName() == this.getName() && person.getSex() == this.getSex()) {
return true;
}
}
return false;
}
public int hashCode(){
int code = 36;
code = 17*code + name.hashCode();
code = 17*code + sex.hashCode();
return code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public class TestEquals {
public static void main(String[] args) {
Person p1 = new Person("张三", "男");
Person p2 = new Person("张三", "男");
Person p3 = new Person("李四", "男");
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p3.hashCode());
}
}
输出结果:
true
false
13213524
13213524
14355448