Java-对象相等判断

我只是一个虾纸丫 提交于 2019-12-01 16:16:32

引用相等性和对象相等性

引用相等性

两个引用指向堆上同一个对象,成为引用相等
在这里插入图片描述

对象相等性

堆上两个对象使用equals方法+hashCode方法 都为true时 认为两个对象是相等的

if (a.equals(b) && a.hashCode() == b.hashCode()) {
    // 两个引用指向同一个对象或者两个对象是相等的 
}

equals和hashCode

equals

java中所有的类都集成自Object类,Object对equals方法的实现如下

 public boolean equals(Object obj) {
        return (this == obj);
    }

因此在未对Object的equals方法做覆盖的时候,equals方法和"=="是相同的效果
equals通常用来比较两个对象的内容是否相等
==用来比较两个对象的地址是否相等。

JDK中说明了实现equals()方法应该遵守的约定:

1)自反性:x.equals(x)必须返回true。

2)对称性:x.equals(y)与y.equals(x)的返回值必须相等。

3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必须为true。

4)一致性:如果对象x和y在equals()中使用的信息都没有改变,那么x.equals(y)值始终不变。

5)非null:x不是null,y为null,则x.equals(y)必须为false。

hashCode

hashCode()在哈希表里面起作用,在往哈希表中(HashSet,HashMap)插入数据的时候,会先调用hashCode方法计算Object哈希码,使用这个哈希码来确定此对象在哈希表中的位置

hash码相同的情况

hash码相同时,再调用equals方法判断内容是否相同,如果相同,则认为是同一个对象,不再存储

hash码不相同的情况

hash码不相同,就分布在不同hash桶内

这就证明了,在hash表中,只要equals方法返回true,则hashcode一定相同,反过来则不一定,hashcode相同,equals为false,则元素在同一个hash桶内

JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明:

1)hashCode()在哈希表中起作用,如java.util.HashMap。

2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。

3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。

4)如果两个对象使用equals()方法判断为不相等,则不要求hashCode()也必须不相等;但是开发人员应该认识到,不相等的对象产生不相同的hashCode可以提高哈希表的性能。

重写equals和hashCode例子

@Override
    public boolean equals(Object another) {
        if (this == another) {
            return true;
        }
        if (another instanceof Person) {
            Person anotherPerson = (Person) another;
            if (this.getName().equals(anotherPerson.getName()) && this.getAge() == anotherPerson.getAge()) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
 
    @Override
    public int hashCode() {
        int hash = 17;
        hash = hash * 31 + getName().hashCode();
        hash = hash * 31 + getAge();
        return hash;
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!