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

Java中的equals()和hashCode() - 超详细篇

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

71810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java中的equals()和hashCode() - 超详细篇

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

    52020

    理解Java中的hashCode和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.8K60

    深入理解Java中的Object类的equals()和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()方法来定义对象相等的规则,那么在集合类中判断两个对象是否相等时就会使用这个规则。

    29610

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

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

    85080

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

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

    1.7K80

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

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

    49310

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

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

    30410

    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类中的

    46600

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

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

    56020

    Effective Java(二)

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

    45620

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

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

    41930

    java中equals,hashcode和==的区别

    java中equals,hashcode和==的区别 相信很多人都很清楚 ==运算符是判断两个对象是不是同一个对象,即他们的地址是否相等 object类中equals与==是等效的 覆写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提供:浅谈Java中的hashcode方法 第10条 始终要覆盖toString Object类默认toString的实现方法是这样的: public String toString

    52320

    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.就算不覆盖方法,可能某些时候超类新增了一个和实现类相同签名的方法,那么实现类又会出问题。

    957110

    equals方法的理解

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

    51841

    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 的五个约定。

    74141
    领券