1、首先我们看看对象默认的(Object)的equals方法和hashcode方法
public booleanequals(Object obj) {
return(this== obj);
}
public native inthashCode();
对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object类的源码我们知道,默认的equals 判断的是两个对象的引用指向的是不是同一个对象;而hashcode也是根据对象地址生成一个整数数值;
![c28b249ecb08741ed2794a69bc683044.png](https://img-blog.csdnimg.cn/img_convert/c28b249ecb08741ed2794a69bc683044.png)
2、重写equals
案例场景:
定义一个User对象有多个属性值姓名、年龄、身份证;
我们写代码的时候会发现,两个new 出来的User()对象 无论他们的的各项值是否一样两个对象equals 永远都是false,两个对象值完全一样放到HashSet里面它会把这两个值完全一样的对象当成两个不同的对象了,这样的话好像HashSet的特性就丢失了;
其实原因就是我们没有重写User 的equals方法,它会调用Object的equals方法,就如上图一样,Object的equals方法是比较对象的引用对象是否是同一个,两个new出来的对象当然不一样。
好了现在需求来了,我们需要两个对象的各项属性值一样的就认为这两个对象是相等的;那么此时我们就需要重写equals方法了;
代码如下:
public classUser {
privateStringname;//姓名
privateStringIdCard;//身份证
private intage;//年龄
/**
* 重写equals
*@paramobj
*@return
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof User) {
User user = (User) obj;
if (user.getIdCard().equals(this.IdCard) && user.getName().equals(th