==、equals和hashcode
一. == 与 equals的区别
- 在java中,==表示比较两个对象的内存地址。如果对于一个对象,没有重写equals的话,那么就会执行Object类里面的equals()方法(因为所有的类都是继承自Object)。
- 而Object类中的equals()方法是直接用==比较,也就是说如果一个类没有重写equals那么其equals方法等价于
二. hashcode的作用
-
hashcode的作用主要是当我们用集合类的时候会用到比如HashMap
-
在HashMap中,比较两个元素是否相等,首先看hashcode如果hashcode不相等那么直接返回false,如果相等,那么在调用equals
-
主要作用还是减少调用equals的次数,并且提高速度
三. 为什么重写equals必须重写hashcode
- 实际应用场景中,尽管是两个对象,但是其某些属性相等我们就可以认为它们是相等的。所以需要重写equals方法
hashcode
hashcode是一个int类型的变量,其根据内存地址计算出的一个hash值,只要地址不同hashcode就不同。
所以如果单纯的只重写了equals而没有重写hashcode就会产生如下问题
重写equals未重写hashCode()
public static void main(String[] args){
Person person1 = new Student("z","Maths");
Person person2 = new Student("z","Maths");
HashSet<Person> map = new HashSet<>();
map.add(person1);
map.add(person2);
System.out.println(map.size());
System.out.println(map);
}
class Student{
//略
@Override
public boolean equals(Object o){
if(this == o) return true;
if(o == null || this.getClass() != o.getClass())
return false;
Student s = (Student) o;
return Objects.equals(this.name,s.name);
}
}
尽管属性相等,但是在hashset中却是以两个对象存储。这是因为HashSet中判断对象是否相等是根据Hashcode判断的,尽管重写了equals,但是没有重写hashcode方法所以返回的hash值还是不同,那么就会被认为是两个对象存储在HashSet中
重写equals并重写hashCode()
@Override
public int hashCode(){
return Objects.hash(this.name);
}