重写HashCode和equals规范
Posted MrPeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写HashCode和equals规范相关的知识,希望对你有一定的参考价值。
hashcode 和 equals 方法是用来鉴定2个对象是否相等。
一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用 ,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。 举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
如下:
package utils; public class Student { private int id; private String name; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (id != other.id) return false; return true; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试类
package utils; import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { Map<Student,String> map = new HashMap<Student,String>(); Student e = new Student(); e.setId(1); e.setName("lol"); Student e1 = new Student(); e1.setId(1); e1.setName("lol"); //商业逻辑是对象中值相等就相等,所以我们需要重写它的 hashCode方法 map.put(e, "1421801Z"); map.put(e1, "1421801Z"); System.out.println(map.toString()); } }
结果:
没有重写HashCode 和 equals 方法
重写HashCode 和 equals 方法
总结分析:
HashCode 方法是根据实体类中某些属性来重写的,上面的id 就是学生的学号(主键)。
equals 方法的比较类型如上。
HashCode 和 equals 方法是map、set容器用来解决重复值得一个工具,当map、set在添加东西进去的时候,首先它会
调用HashCode 方法,由于每个对象都有唯一的Hash码所以是不同的,但是我们可以通过重写HashCode 来达到当“值”相等的情况下,默认相等。
然后再去调用equals 方法判断两者是否相等。
以上是关于重写HashCode和equals规范的主要内容,如果未能解决你的问题,请参考以下文章
为什么在重写 equals 方法的时候需要重写 hashCode 方法?
SpringBoot 重写hashCode方法和equals方法