学习
实践
活动
工具
TVP
写文章

java equals方法

object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。 getClass方法将返回一个对象所属的类,有关这个方法的详细内容稍后进行介绍。在检测中,只有在两个对象属于同一个类时,才有可能相等。

17230

hashCode和equals方法

hashCode和equals方法是Object类中的两个常用方法。 其定义如下: // hashCode()方法默认是native方法: public native int hashCode(); // equals(obj)默认比较的是内存地址: public boolean equals(Object obj) { return (this == obj); } hashCode()方法有三个关注点: 关注点1:主要是这个hashCode方法对哪些类是有用的 hashCode重写的原则:当equals方法返回true,则两个对象的hashCode必须一样。 equals()方法在get()方法中的使用: ? ? 如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时覆写(重载)equals方法和hashCode方法,而不要只写其中一个

17420
  • 广告
    关闭

    年末·限时回馈

    热卖云产品年终特惠,2核2G轻量应用服务器6.58元/月起,更多上云必备产品助力您轻松上云

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

    正确使用 equals 方法

    Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 举个例子: // 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 String str = null; if (str.equals("SnailClimb")) { ... : "SnailClimb".equals(str);// false 不过更推荐使用 java.util.Objects#equals(JDK7 引入的工具类)。 Objects.equals(null,"SnailClimb");// false 我们看一下java.util.Objects#equals的源码就知道原因了。 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常

    25810

    为什么在重写equals方法时都要重写equals方法

    为什么在重写equals方法时都要重写equals方法呢: 首先equals与hashcode间的关系是这样的: 1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同 ; 2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false) 我们没有在类中里定义hashCode方法。 这里调用的仍是Object类的hashCode方法(所有的类都是Object的子类),而Object类的hashCode方法返回的hash值其实是类实例化对象的内存地址。 由于我们在类中没有定义equals方法,系统就不得不调用Object类的equals方法。由于Object的固有方法是根据两个对象的内存地址来判断,所以两个对象一定不会相等。 举例:hashset 和hashmap key都是对象的hashcode,但是只重写了equals而没有重写hashcode(),不同的key对应相同的value。

    10221

    详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。 虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: (1)自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 (2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。 (3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    19710

    详解equals()方法和hashCode()方法

    虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: (1)自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 (2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。 (3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。 1、重写hashcode()的原则 通过前面的描述我们知道,重写hashCode需要遵守以下原则: (1)如果重写了equals()方法,检查条件“两个对象使用equals()方法判断为相等,则hashCode 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    18720

    详解 equals() 方法和 hashCode() 方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。 虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: 自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。 如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    22930

    详解 equals() 方法和 hashCode() 方法

    一、equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: (1)自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 (2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。 (3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    13910

    equals方法的理解

    通常在面试中会被问到equals方法和==的区别,以及有没有重写过equals方法,以及重写equals方法的约定是什么? equals方法(通常属于值类的情况)。 —来自于effective Java 中文版 但是在覆盖equals方法的时候要遵守的约定如下: equals方法实现了等价的关系 1.自反性。 也 就是说如果我们不重写equals方法,并且对应的父类中也都没有重写过equals,可以默认为是用equals使 用的是比较对象的地址是否相同。 而equals之所以存在,是希望用户的子类去重写这个方法,实现对比值的功能。类似的String就实现了 equals方法。自己去实现这个方法是因为当我们两个对象对比时只选取其中关键的业务属性上面来。

    23241

    详解 equals() 方法和 hashCode() 方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。 一、equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: (1)自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    38231

    详解equals()方法和hashCode()方法

    一、equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实现可以看出 虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现equals()方法应该遵守的约定: (1)自反性:x.equals(x)必须返回true。 与equals()方法类似,hashCode()方法可以被重写。 (2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。 (3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。 在该例中,Person类重写了equals()方法和hashCode()方法。因为equals()方法中只使用了name域和age域,所以hashCode()方法中,也只计算name域和age域。

    35241

    重写equals和hashCode方法

    = true,那么来看看String内部是如何实现这种功能的 String内部的equals方法 public boolean equals(Object anObject) { if (this 重写equals方法 自定义的类该怎么实现equal方法呢? 这里得遵循如下规则 两对象若equals相同,则hashCode方法返回值也得相同 两个对象的hashCode返回值相同二者equals不一定相同 从该规则可以知道,重写equals必须重写hashCode 方法,因为hashCode是对堆内存的对象产生的特殊值,如果没有重写,不同对象产生的哈希值基本是不同的(哈希碰撞),集合中判断对象是否相同也是先判断哈希值再判断equals,Object的hashCode 是native方法,所以不放出源码了,下面直接挂出重写equal的代码(仿照String) 重写自定义类的equals方法 public class User { private String

    36120

    String类的equals方法

    先上代码 public boolean equals(Object anObject) { if (this == anObject) { //1.比地址 return i++; } return true; } } return false; } 字符串比较方法可以看出从大方向到小方向对比

    30830

    String equals()方法 源码分析

    public boolean equals(Object anObject) { // ==:比较的引用类型,比较的是地址值是否相同 if (this == anObject) { //地址值相等 i++; } return true; } } return false; } 总结:String equals ()方法思路:先比较地址值是否相等,在比较字符串的长度是否相等,最后对每个字符做一一对应比较。

    21630

    Java 覆盖equals和hashCode方法

    前言 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重,最容易避免这类问题的办法就是不覆盖equals方法。 什么时候需要覆盖equals方法? 如果类具有自己特有的“逻辑相等”概念(不同于对象等同),而且超类还没有覆盖equals方法以实现期望的行为,这时需要覆盖equals方法。 覆盖equals 覆盖equals方法时,必须遵守它的通用约定,如果你违反了它们,就会发现你的程序将表现不正常,甚至奔溃,而且很难找到失败的根源。 通用约定 自反性。 对于任何非null的引用值x、x,equals(null),必须返回false。 一般IDE工具,如IntelliJ IDEA可以帮助实现equals方法覆盖。基本上是符合以上约定的。 ? (point2.equals(point3)); } 运行结果: false false true 覆盖hashCode方法 重写equals方法必须要重写hashCode方法

    42710

    你真的了解 equals 方法吗?

    用于获取调用对象的哈希码值(内存地址和编号)并返回 - 若两个对象调用equals()方法相等,则各自调用该方法得到的哈希码值必须相同 - 若两个对象调用equals()方法不相等,则各自调用该方法的结果可以相同 在TestStudent类中进行测试 显然,因为equals方法默认比较的是地址,这里s1与s2地址不同,输出为false。 那么,如果我们想要另两个对象学号相同时,使用equals 方法时输出为true 应该怎么做呢,很显然,equals方法是属于Object类的,那么我们只要在Student类中对其进行重写即可 这里,我们对 根据前面所讲的,我们明白了,原来 $\color{red}String类中也对equals方法进行了重写$, 那么我们就明白了。到这里就完了吗? 不,还没有,前面我们说过,一般为了维护hashCode方法的常规协定,我们要在Student类中重写 hashCode方法 // 为了保证和equals方法结果一致性,需要重写hashCode @Override

    15187

    重写equals方法必须重写hashcode

    equals方法定义在java的根类Object类,定义如下 public boolean equals(Object obj) { return (this == obj); } 比较的是引用 ,也就是对象的地址是否相等,equals在非空对象上需要满足以下特性: 1.自反性:x.equals(x) == true,自己和自己比较相等 2.对称性:x.equals(y) == y.equals y和z相等,则x和z相等 4.一致性 : 如果x对象和y对象有成员变量num1和num2,其中重写的equals方法只有num1参加了运算,则修改num2不影响x.equals(y)的值 x.equals ,也就是用equals方法判断的两个对象相等,但是hashcode不相等,会造成hashmap散列到不同数组下标,导致了哈希表中有两个相同的key,hashmap相同的key是可选的,但是默认是只能有唯一的 必相等,如果引用不相等,则调用equals方法判断对象是否相等,如果相等说明 //当前key已经存在,插入的值会将旧key的vaule覆盖 if (p.hash ==

    11720

    Java重写equals和hashCode方法

    前言 重写equals和hashCode方法,可加深对hash算法的理解 为什么重写 重写equals方法为了判断对象是否在逻辑上为同一个对象 重写hashCode方法是为了提高hash效率, 并且和equals 保持一致 什么场景需要重写 场景: 用户User对象去重 比如有对象User, 其中包含用户id和用户名称, 需要对大量用户进行去重操作, 这时就需要重写User对象的hashCode和equals方法 如何重写 代码如下 import java.util.Objects; /** * 重写User对象的equals和hashCode方法 **/ public class User { private 方法表示 id 和 name 相同的对象就判定为相同对象 @Override public boolean equals(Object o) { if (this == 和hashCode重写方法 使用IDEA, 在类中按 Alt + Insert 可以自动实现equals() 和 hashCode() 方法的重写, 并可以选择重写的代码的实现方式, 包括原生、commons-lang

    3.1K51

    ==号和equals方法的区别

    “==” 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型, 基本数据类型比较的是值,引用数据类型比较的是地址值 equals() 方法 只能比较引用数据类型,所有的对象都会继承 Object 类中的方法,没有重写 Object 类中的 equals 方法,equals方法和==号比较引用数据类型无区别, 重写后的equals方法比较的是对象中的属性。

    16440

    hashCode和equals方法的作用

    hashCode()方法用于给对象返回hash code值,equals()方法用 于判断其他对象与该对象是否相等。为什么需要这 两个方法呢? 我们知道HashSet中是不允许添加重复元素的,那么当调用add()方法向HashSet中添加元素时,是如 何判断两个元素是不同的。这就用到了hashCode()和equals()方法。 如果该区域已经有数据了,就继续调用equals()方法判断数据是否相等,如果相等就说明数据重复 了,就不能再添加了。如果不相等,就找到一个位置进行存储。 假设此时Set集合中已经有100个元素,那么如果 想添加第101个元素,如果此时没有使用哈希算法,就需要调用equals()方法将第101个元素与前100个元素依次进 行比较,如果元素更多,比较所耗费的时间就越长 反之,如果两个对象的hashCode值相等,那么这两个对象 不一定相等,还需要使用equals()方法进行判断。

    15510

    扫码关注腾讯云开发者

    领取腾讯云代金券