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

重写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...(x),两个对象调用equals的的结果应该一样 3.传递性:如果x.equals(y) == true y.equals(z) == true 则 x.equals(z) == true,x和y相等,...y和z相等,则x和z相等 4.一致性 : 如果x对象和y对象有成员变量num1和num2,其中重写equals方法只有num1参加了运算,则修改num2不影响x.equals(y)的值 x.equals...(null)必须为false 知道了equals的特性,为啥重写equals必须要重写hashcode呢,其实这个不是语法定义,只是如果不重写hashcode在我们调用HashSet和HashMap的时候可能会造成歧义

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

    重写hashcode()和equals()

    在实际使用中,如果HashMap中的key是自定义的类,一般我们都会重写hashcode()和equals(),这是为什么呢??...public native int hashCode(); 默认的根类Object提供了两个方法的实现,为什么我们还需要重写它们呢?解答这个问题,需要从两个方面展开。...当HashMap中插入值或查询值对应的散列码与数组中的散列码相等时,则会通过equals方法比较key值是否相等,所以想以自建对象作为HashMap的key,必须重写该对象继承object的equals...本来不就有hashcode()和equals()了么?干嘛要重写,直接用原来的不行么? HashMap中,如果要比较key是否相等,要同时使用这两个函数!...如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为 同一对象(即进行内存地址的比较),所以必定要两个方法一起重写

    51010

    为什么重写equals()也要重写hashCode()

    ,那么y.equals(x)也应该返回true 传递性:对于多个对象x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,那么y.equals(z)也应该返回true...如果你不将自定义的类定义为HashMap的key值的话,那么我们重写equals方法而没有重写hashCode方法,编译器不会报任何错,在运行时也不会抛任何异常。...如果你想将自定义的类定义为HashMap的key值得话,那么如果重写equals方法那么就必须也重写hashCode方法。...接下来我们可以看一下我们使用自定义的类作为HashMap的key,并且自定义的类不重写equals和hashCode方法会发生什么。...接下来我们就重写一下这两个方法。如果我们使用IDEA的话,那么直接使用快捷键即可。 ?

    1K10

    重写equals和hashCode方法

    其实我们日常也经常使用这种比较,只是没有注意到而已,没错那就是字符串,String.equals( ),虽然不是同一对象,但只要内容相同,就返回true,即:"123".equals("123") =...重写equals方法 自定义的类该怎么实现equal方法呢?...这里得遵循如下规则 两对象若equals相同,则hashCode方法返回值也得相同 两个对象的hashCode返回值相同二者equals不一定相同 从该规则可以知道,重写equals必须重写hashCode...方法,因为hashCode是对堆内存的对象产生的特殊值,如果没有重写,不同对象产生的哈希值基本是不同的(哈希碰撞),集合中判断对象是否相同也是先判断哈希值再判断equals,Object的hashCode...是native方法,所以不放出源码了,下面直接挂出重写equal的代码(仿照String) 重写自定义类的equals方法 public class User { private String

    88620

    重写equals就必须重写hashCode的原理分析

    如果不被重写(原生Object)的hashCode和equals是什么样的?   不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。  ...不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。 为什么需要重写equals和hashCode方法?       ...在这种情况下,原生的equals方法就不能满足我们的需求了       所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。...那么为什么在重写equals方法的时候需要重写hashCode方法呢?      ...如果只重写equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)。

    1K90

    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...String id;//用户Id private String name;//用户名称 //... getter setter Constructor //重写equals...和hashCode重写方法 使用IDEA, 在类中按 Alt + Insert 可以自动实现equals() 和 hashCode() 方法的重写, 并可以选择重写的代码的实现方式, 包括原生、commons-lang

    6.8K51

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

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时...hashCode()为false时,obj1.equals(obj2)必须为false如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等...特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该类已重写equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址hashcode...这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true...hashcode也只用于HashSet/HashMap/Hashtable类存储数据,所以会用于比较,需要重写 总结,自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较

    1.8K60

    Java--==和equals的普遍重写

    123"); System.out.println(u1==u2); System.out.println("#################"); System.out.println(u1.equals...System.out.println(str1==str2); System.out.println("#################"); System.out.println(str1.equals...==不能够进行重写equals 方法默认就是比较两个对象的hashcode(hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值),也就是说默认比较的是两个对象的地址相同则...true不同则flase; 通常我们对equal会进行重写,比如说一个系统里一个人注册了n个号,我们是根据其手机号判断是否为一个人的号,而不是昵称等信息;就连Object类里定义的String.equals...方法也是经过重写的,不在是地址相同为true,而是字符串完全相同判断为true

    34410
    领券