hashcode 和 equals

先看个例子

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String name;
    private String addr;

    public int hashCode() {
         return 1;
    }
    public boolean equals(Object obj) {
        return true;
    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Man {
    private String name;
    private String addr;
}

public static void main(String[] args) {
	Student student = new Student("xxx", "xxx");
	Student student2 = new Student("yyy", "yyy");
	System.out.println(student.equals(student2));// true
	Man man = new Man("xxx", "xxx");
	Man man2 = new Man("yyy", "yyy");
	System.out.println(man.equals(man2));// false
	
	// 以下是将Student中覆写equals方法注释,留下hashcode方法
	Student student = new Student("xxx", "xxx");
    Student student2 = new Student("xxx", "xxx");
    System.out.println(student.equals(student2));// false
    
	// 以下是将Student中覆写hashcode方法注释,留下equals方法
	Student student = new Student("xxx", "xxx");
    Student student2 = new Student("xxx", "xxx");
    System.out.println(student.equals(student2));// true
    
    // 以下是没有修改Man中的属性及方法修改的情况下
    Man man = new Man("xxx", "xxx");
	Man man2 = new Man("xxx", "xxx");
	System.out.println(man.equals(man2));// true
    System.out.println("man : "+man.hashCode());//  7153081
    System.out.println("man2: "+man2.hashCode());// 7153081
	
	// 以下是覆写Man中的equals 和hashcode方法,与Student中覆写保持相同的返回值
	Student student = new Student("111", "111");
	Man man = new Man("xxx", "xxx");
	System.out.println(man.equals(student));// true
	// 
}

获取哈希码,也称为散列码,通过返回一个int值确定对象在hash表中的索引位置,其定义在object中,所以任何类都包含hashcode()函数;

例如:HashSet在添加数据的时候会先通过hashcode()计算该位置是否有值,有值再通过equals来检查两个对象是否相同,相同的话加入失败,成功的话重新散列到其他文职,减少了equals的次数,增加了执行速度

  • HashCode值一致不一定是一个对象
  • 相等的对象的HashCode的值一定是一样的
  • 相等的对象调用equals方法返回的都是true;
  • 所以在重写equals方式的时候HashCode的方法也需要被重写;
  • hashcode()的默认行为是在堆上的对象产生独特值,
  • 如果没有重写hashcode,则两个class无论如何都不会相等
上一篇:man命令详解


下一篇:[LeetCode] 1232. Check If It Is a Straight Line 缀点成线