首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

equals方法覆盖超类中的equals,可能不是对称的

equals方法覆盖超类中的equals,可能不是对称的。

在Java中,equals方法是用于比较两个对象是否相等的方法。当我们需要自定义对象的相等性判断时,通常会覆盖equals方法。

然而,当我们覆盖超类中的equals方法时,需要注意到equals方法的对称性。对称性是指如果两个对象A和B相等,那么B和A也应该相等。

然而,如果我们在子类中覆盖了超类中的equals方法,但没有正确处理超类的字段,就可能导致equals方法不是对称的。

例如,考虑以下代码:

代码语言:java
复制
class SuperClass {
    private int id;

    public SuperClass(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SuperClass other = (SuperClass) obj;
        return id == other.id;
    }
}

class SubClass extends SuperClass {
    private String name;

    public SubClass(int id, String name) {
        super(id);
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SubClass other = (SubClass) obj;
        return super.equals(obj) && Objects.equals(name, other.name);
    }
}

在上面的代码中,SuperClass是一个超类,SubClass是其子类。SuperClass中的equals方法只比较id字段,而SubClass中的equals方法比较id和name字段。

然而,由于SubClass中的equals方法没有调用超类的equals方法来比较id字段,就导致了equals方法不是对称的。具体来说,如果我们创建一个SuperClass对象和一个SubClass对象,它们的id相等,但name不相等,那么SuperClass对象调用equals方法比较SubClass对象会返回false,而SubClass对象调用equals方法比较SuperClass对象会返回true。

为了解决这个问题,我们应该在子类的equals方法中调用超类的equals方法来比较超类的字段。修改后的代码如下:

代码语言:java
复制
class SubClass extends SuperClass {
    private String name;

    public SubClass(int id, String name) {
        super(id);
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SubClass other = (SubClass) obj;
        return super.equals(obj) && Objects.equals(name, other.name);
    }
}

通过调用super.equals(obj)来比较超类的字段,我们保证了equals方法的对称性。

总结起来,当覆盖超类中的equals方法时,需要注意处理超类的字段,以保证equals方法的对称性。这样可以确保在比较对象相等性时得到正确的结果。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Javaequals()和hashCode() - 详细篇

,谢啦 简介 说到equals和hashCode,首先要说下Object 我们都知道,这个Object是Java所有,其他都是从Object直接或间接继承而来 而Object自带equals...,所以会显得有点啰嗦,需要看结论可以直接跳到文末看总结 什么是equals方法 equals方法用来比较两个对象属性是否相等,也可以说是比较两个引用对象是否为同一个对象(因为Objectequals...上面的instanceof有个很大缺陷,就是违反了equals对称性 下面我们顺藤摸瓜,来说下equals方法规范5个特性: 自反性:就是自己反过来跟自己比,要返回true;比如x.equals(...(Son)却有可能为真,这就不对称了 所以干脆就让Father.equals(Son)也永远不为真 那要怎么做呢?...关于散列这里就不展开了,我们在这里只需要知道两点: 散列值为整数,可以为负值 散列值可以用来确定元素在散列表位置(有可能两个元素拥有相同散列值,这个就是散列冲突) 在Object,hashCode

66210

Javaequals()和hashCode() - 详细篇

,谢啦 简介 说到equals和hashCode,首先要说下Object 我们都知道,这个Object是Java所有,其他都是从Object直接或间接继承而来 而Object自带equals...,所以会显得有点啰嗦,需要看结论可以直接跳到文末看总结 什么是equals方法 equals方法用来比较两个对象属性是否相等,也可以说是比较两个引用对象是否为同一个对象(因为Objectequals...上面的instanceof有个很大缺陷,就是违反了equals对称性 下面我们顺藤摸瓜,来说下equals方法规范5个特性: 自反性:就是自己反过来跟自己比,要返回true;比如x.equals(...(Son)却有可能为真,这就不对称了 所以干脆就让Father.equals(Son)也永远不为真 那要怎么做呢?...关于散列这里就不展开了,我们在这里只需要知道两点: 散列值为整数,可以为负值 散列值可以用来确定元素在散列表位置(有可能两个元素拥有相同散列值,这个就是散列冲突) 在Object,hashCode

42120

理解JavahashCode和equals方法

在Java里面所有的都直接或者间接继承了java.lang.Object,Object里面提供了11个方法,如下: 这里面我们常用方法有三个: toString方法,相信用过Java的人都不会陌生...,注意这个数字 并不是实际内存地址,Java是没办法直接获取内存地址,必须得由C或者C++获取,所以这个方法是用 native修饰 由于默认情况下,equals方法比较是内存地址,而在实际开发...举例如下: 定义如下: 直接比较两个对象,结果是不相等: 因为他们内存地址是不同,所以结果是false,如果我们想要认为他是相等,那么就需要重写 equals方法: 在重写equals方法后...,我们在比较两个对象,发现就相等了 接着我们看第二个例子,将其放入ArrayList,然后判断是否存在,发现也生效了: 到目前为止,我们还没有对hashCode进行操作,那么大家可能会有一个疑问,...hash数据结构

1.5K100

JAVA重写equals()方法同时要重写hashcode()方法

object对象 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时...,通常有必要重写 hashCode 方法,以维护 hashCode 方法常规协定,该协定声明相等对象必须具有相等哈希码。...特别指出利用equals比较八大包装对象(如int,float等)和String(因为该类已重写了equals和hashcode方法)对象时,默认比较是值,在比较其它自定义对象时都是比较引用地址hashcode...hashcode也只用于HashSet/HashMap/Hashtable存储数据,所以会用于比较,需要重写 总结,自定义要重写equals方法来进行等值比较,自定义要重写compareTo方法来进行不同对象大小比较...,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable时进行比较

1.7K60

深入理解JavaObjectequals()和hashCode()

文章目录 1. equals()方法和hashCode()方法联系 1.1 equals()方法 1.2 hashCode()方法 2. equals()、hashCode()和集合关系 2.1...❤️ 在Java编程,Object是所有,它提供了一些基本方法来操作对象。其中,equals()和hashCode()是两个重要方法,它们在处理对象比较和哈希码计算方面具有关键作用。...本文将深入探讨这两个方法联系以及它们在Java编程应用。 1. equals()方法和hashCode()方法联系 1.1 equals()方法 equals()方法用于比较两个对象是否相等。...因此,我们可以在重写equals()方法,实现自定义对象比较逻辑。 1.2 hashCode()方法 hashCode()方法用于计算对象哈希码(散列码)。...2.1 equals()方法影响 如果我们重写了equals()方法来定义对象相等规则,那么在集合判断两个对象是否相等时就会使用这个规则。

24310

【答疑解惑】Java默认构造器和equals方法

1、Java默认构造器: 在Java你要创建一个对象肯定会调用new语句来创建一个对象,在new时候会调用对象初始化函数,默认如果你没有写构造函数的话编译器会自动给你创建一个无参构造函数,如果你自己写了构造函数则根据你...2、Javaequalsequals操作是对象objectA.equals(objectB),作用是比较两个对象是否相同。...Java中所有的都是从基Object继承过来,默认你在比较两个对象时候调用是Objectequals方法: public boolean equals(Object o) { return...如果你想让v1.equals(v2)返回为true则需要在Value重写Objectequals方法:如下: @Override public boolean equals(Object obj)...{ Value a = (Value)obj; return i == a.i; } 重写equals方法,比较是Valuei值。

81480

如何在Java避免equals方法隐藏陷阱(二)

x和y域不再是final,并且两个set方法被增加到来,并允许客户改变x和y值。...如果你需要根据对象当前状态进行比较的话,你应该不要再重定义equals,应该起其他方法名字而不是equals。...在另外一方面,“cp等价于p”比较这个调用是定义在ColoredPointequals方法,返回结果却是false,这是因为p不是ColoredPoint,所以equals这个定义违背了对称性...你如何修改equals定义,才能使得这个方法满足对称性?本质上说有两种方法,你可以使得这种关系变得更一般化或更严格。...} } 在ColoredPointequals新定义比老定义检查了更多情况:如果对象是一个Point对象而不是ColoredPoint,方法就转变为Pointequals方法调用。

1.6K80

Java面试题总结--(1)Javaequals方法和hashCode方法异同

返回是内存实实在在存在Person 这个 2.可以获得获取Person相关信息 :获得了Person这个()Class,进而通过返回Class对象获取Person相关信息,比如:获取Person...(注意:集合不允许重复元素存在)。 也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。...但是如果集合已经存在一万条数据或者更多数据,如果采用equals方法去逐一比较,效率必然是一个问题。...肯定是不可以,因为不同对象可能会生成相同hashcode值。...二.equals方法和hashCode方法   在有些情况下,程序设计者在设计一个时候为需要重写equals方法,比如String,但是千万要注意,在重写equals方法同时,必须重写hashCode

47410

《Effective Java》读书笔记(二)之对于所有对象都通用方法

第八条 在改写equals时候请遵守通用约定 一般以下几种情况,不适宜覆盖equals方法 1.每个实例本质上都是唯一,对于代表活动实体而不是确实如此,例如Thread. 2.不关心是否提供了...“逻辑相等”测试功能 3.已经覆盖equals,从继承过来行为对子类也是合适 4.是私有的或者包级私有的,可以确定它equals方法永远不会被调用。...如果类具有自己特有的“逻辑相等”概念(不同于对象等同概念),而且没有覆盖equals以实现期望行为,就需要进行覆盖,这通常属于“值情形,例如Integer和Date。...当使用equals来比较对象, 是希望他们在逻辑上是否相等, 而不是指向同一对象, 或者用来作为Mapkey以及集合Set元素时, 就必须复写equals方法....做了兼容大小写处理,但是String equals方法是不知道要不区分大小写1,所以s.equals(cis)会返回false,违反了自反性 假如你把CaseInsensitiveString

28210

用了这么久equals,你知道还要遵守约定么

该类每个实例本质上都是唯一 即使对于像Thread 这种代表活动状态实体而不是来说也是如此。Object提供equals方法也能确保这个展现出正确行为。 2....已经重写了equals方法,并且行为对此类也适用 例如:大部分Set实现从AbstractSet那里继承了equals方法,List实现从AbstractList那里继承了equals 方法,...当一个具有逻辑相等概念时,它不仅仅是对象身份,而还没有覆盖equals,这通常属于值情形。一个值仅仅是一个代表了值,例如Integer 或者String。...如果不是,则返回 false。 对于该类每个域,检查参数域是否与该对象对应域相匹配。 编写完成后,你还需要问自己: 它是否是对称、传递、一致?...下面是一些告诫: 覆盖 equals 时总要覆盖 hashCode 不要企图让 equals 方法过于智能 不要将 equals 声明 Object 对象替换为其他类型。

53920

Effective-java-读书笔记之对于所有对象都通用方法

(代表活动实体如Thread.)不关心是否提供了逻辑相等测试功能.已经覆盖equals, 从继承过来行为对于子类也是合适....例外: 实例受控: 枚举, 一个值对应一个实例, 所以不需要覆盖equals.覆盖equals方法时候, 必须要遵守通用约定:* 自反性(reflexive): 对象必须等于其自身.* 对称性(..., 检查参数域是否与该对象对应域相匹配.* 当你编写完成了equals方法之后, 应该问自己三个问题: 它是否是对称, 传递, 一致?...(其他两个特性通常会自动满足.)注意覆写方法加上@Override, equals方法参数类型是Object, 不要弄错.第11条 覆盖equals时总要覆盖hashCode在每个覆盖equals方法...= x* x.clone().getClass() == x.getClass()* x.clone().equals(x) 通常要求这三个表达式都为true, 但不是绝对.如果你覆盖了非final

43900

Effective Java(二)

在这类情况之下,从Object继承得到 equals 实现已经足够了。 已经覆盖equals行为对于这个也是适合。...从用户角度来看,对于有用 equals 方法,每个等价所有元素都必须是可交换。 在覆盖 equals 方法时候,必须要遵守它通用约定。...为了获得最佳性能,应该最先比较最有可能不一致域,或者是开销最低域,最理想情况是两个条件同时满足域。 在编写完 equals 方法之后,应该问自己三个问题:它是否对称、传递、一致?...覆盖 equals 时总要覆盖 hashCode 在每个覆盖equals 方法,都必须覆盖 hashCode 方法。...在实际应用,toString 方法应该返回对象包含额所有值得关注信息 总结 总而言之,要在你编写每一个可实例化覆盖 Object toString 实现,除非已经在这么做了。

44220

效率编程 之「对于所有对象都通用方法

最容易避免这类问题办法就是不覆盖equals方法,在这种情况下,每个实例都只与它自身相等。...如果类满足了以下任何一个条件,就不需要我们覆盖equals方法每个实例本质上都是唯一; 不关心是否提供了“逻辑相等”测试功能; 已经覆盖equals方法,从继承过来行为对于子类也是合适...有一种“值”不需要覆盖equals方法,即用实例受控确保“每个值至多只存在一个对象”,如枚举类型。...否则的话,如果要覆盖equals方法,则需要满足以下等价关系: 自反性,对于任何非null引用值x,x.equals(x)必须返回true; 对称性,对于任何非null引用值x和y,当且仅当x.equals...第 2 条:覆盖equals方法时总要覆盖hashCode方法 一个很常见错误根源在于没有覆盖hashCode方法。在每个覆盖equals方法,也必须覆盖hashCode方法

40230

javaequals,hashcode和==区别

javaequals,hashcode和==区别 相信很多人都很清楚 ==运算符是判断两个对象是不是同一个对象,即他们地址是否相等 objectequals与==是等效 覆写equals更多是追求两个对象在逻辑上相等...对象是放在堆,栈存放是对象引用(地址)。由此可见'=='是对栈值进行比较。如果要比较堆对象内容是否相同,那么就要重写equals方法了。 二....(Object obj) { return (this == obj); } 这说明在我们实现自己equals方法之前,equals等价于==,而==运算符是判断两个对象是不是同一个对象...不关心是否提供了逻辑相等测试功能:有的使用者不会用到它比较值得功能,比如Random,基本没人会去比较两个随机值吧 已经覆盖equals,子类也只需要用到行为:比如AbstractMap...初学者可以这样理解,hashCode方法实际上返回就是对象存储物理地址(实际可能不是)。 3.1 hashCode作用 想要明白,必须要先知道Java集合。

1.4K31

​第3章 对于所有对象都通用方法

第8条 覆盖equals时请遵守通用约定 不覆盖equals覆盖equals情况下,每个实例都与它自身相等,如果满足以下任何一个条件,就是所期望结果: 每个实例本质上都是唯一 不关心是否提供了...”逻辑相等”测试功能 已经覆盖equals,从继承过来行为对于子类也是合适(要小心) 是私有的或是包级私有的,可以确定它equals方法永远不会被调用 (不懂为什么) 讲得怪怪 PS...(比如学生有学号,班级,姓名这些重要属性,我们都需要去比对) 当你编写完成了equals方法之后,应该问自己是哪个问题:它是否是对称、传递、一致?...Object通用约定(在Object注释即是): 在应用程序执行期间,只要对象equals方法比较操作所用到信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数...其他资料 dim提供:浅谈Javahashcode方法 第10条 始终要覆盖toString Object默认toString实现方法是这样: public String toString

50320

Effective Java笔记(不含反序列化、并发、注解和枚举)

4.可能当一个对象被回收时候,终结方法根本就没执行过 5.可能在一个JVM终结方法被执行了,但是另一个却不会被执行 2.对于所有对象都通用方法 1.覆盖equals时请遵守通用规定: 1.在不覆盖...3.覆盖equals,其行为对子类也适用 4.是私有或者包级私有,就可以确认其equals方法永远不会被调用,此时应该在其equals方法抛出异常 2.在什么时候应该覆盖equals呢?...1.这个我们需要比较其逻辑上相等,如Integer 2.该类没有覆盖equals实现期望行为 3.覆盖一个equals时候要满足以下几个关系: 1.自反性:非null,x.equals(...:对于每个不同值都要一个单独对象 3.复合优先于继承: 1.继承缺点: 1.一个进行了继承,或许当时是可用,但是随着演化,某一时刻其可能就不可用了 2.有些可继承方法可能在自身实现时候进行了...3.就算不覆盖方法可能某些时候新增了一个和实现相同签名方法,那么实现又会出问题。

936110

equals方法理解

其次,重写equals方法原则或者说约定是什么,以及什么时候应该覆盖equals呢 如果类具有自己特有的“逻辑相等”概念(不等同于对象等同概念),而且还没有覆盖equals以实现期望行为,这个时候我们要覆盖...equals方法(通常属于值情况)。...—来自于effective Java 中文版 但是在覆盖equals方法时候要遵守约定如下: equals方法实现了等价关系 1.自反性。...也 就是说如果我们不重写equals方法,并且对应也都没有重写过equals,可以默认为是用equals使 用是比较对象地址是否相同。...也就是说,两个对象值是否相等 是自己业务来决定不是java语言本身所决定。 3. a和b在内存是如何分配(是怎样)?

50141

java-覆盖equals和hashcode方法

在java,Object对象equals默认使用是,因此,如果要实现真正逻辑值相等,即比较内容相同,则需要对equals进行重写。...2.不用覆盖equals条件 在effictive java一书中,定义不用覆盖equals条件如下: 1.每个实例本质上都是唯一 用这个表示活动实体,而不是值,如Thread,用Object...3.已经覆盖equals, 对于子类也适用 这种情况父已经覆盖,无需重复覆盖。 4.是私有或者包级私有,确定它equals永远不会被调用。 此种情况下应该抛出异常。...#4.覆盖equals注意事项 1.覆盖时总是要覆盖hashCode方法 2.别想着把equals做得太“智能” 3.不要把equals方法Object参数对象替换成其他类型(从Override...4.在每次覆盖equals方法都逐一审查equals 五个约定。

70141
领券