HashCode介绍:
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,Java中的任何类都包含有hashCode() 函数。
为什么重写equals方法还要重写hashcode?
重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Map集合类型。我们知道对于HashSet和HashMap集合类型,是不会存在重复数据的。当向HashSet类型存放一个元素时,首先会判断Set中是否已经存在相同的元素。
比如对象作为key的元素(对象A,value)加入HashSet时,Hashet会进行如下判断:
- HashSet会先计算对象A的hashcode值来得到对象要加入的内存位置,看该位置是否有值,
- 如果没有,则HashSet会假设集合中没有与对象A重复的元素,则加入集合;
- 如果有值,则会调用equals()方法来检查两个值是否真的相同,
- 如果equals()方法判定两者相同,则HashSet认为是重复的元素,不会让其加入集合;
- 如果equals()方法判定两者不同,则HashSet会将该元素重新散列到其他位置。
作用:这样大大减少了equals的次数,相应就大大提高了执行速度。
举例说明
定义一个Person类,重写equals方法,规定id相等则相同。
public class Pserson {
private String id;
private String birth;
private String name;
private String phone;
public Pserson() {
}
public Pserson(String id) {
this.id = id;
}
public void setPhone(String phone) {
this.phone = phone;
}
public static void main(String[] args) {
//p1 p2 id相同 phone不同
Pserson p1 = new Pserson("123456789");
p1.setPhone("13900001111");
Pserson p2 = new Pserson("123456789");
p2.setPhone("13900002222");
HashSet<Pserson> set = new HashSet<>();
set.add(p1);
set.add(p2);
System.out.println(p1.equals(p2));
System.out.println(set.size());
}
//重写equals方法,规定id相同则相等,即同一个人
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Pserson)) return false;
Pserson pserson = (Pserson) o;
return id.equals(pserson.id);
}
//不重写hashcode
// @Override
// public int hashCode() {
// return Objects.hash(id);
// }
}
不重写hashcode输出如下
true
2
即HashSet加入了重复元素,没有覆盖
重写hashcode
public class Pserson {
private String id;
private String birth;
private String name;
private String phone;
public Pserson() {
}
public Pserson(String id) {
this.id = id;
}
public void setPhone(String phone) {
this.phone = phone;
}
public static void main(String[] args) {
//p1 p2 id相同 phone不同
Pserson p1 = new Pserson("123456789");
p1.setPhone("13900001111");
Pserson p2 = new Pserson("123456789");
p2.setPhone("13900002222");
HashSet<Pserson> set = new HashSet<>();
set.add(p1);
set.add(p2);
System.out.println(p1.equals(p2));
System.out.println(set.size());
}
//重写equals方法,规定id相同则相等,即同一个人
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Pserson)) return false;
Pserson pserson = (Pserson) o;
return id.equals(pserson.id);
}
//重写hashcode
@Override
public int hashCode() {
return Objects.hash(id);
}
}
重写hashcode输出如下
true
1
hashset只添加了一个元素