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

为什么case类要求重写equals()?

case类要求重写equals()方法是为了确保在比较两个对象是否相等时,能够按照预期的方式进行比较。equals()方法是用来比较两个对象是否相等的,而在Java中,默认的equals()方法是比较两个对象的引用是否相等,即比较两个对象是否指向同一个内存地址。

然而,在实际开发中,我们通常希望比较的是对象的内容是否相等,而不仅仅是引用是否相等。因此,对于case类这种用于模式匹配的类,它的实例通常是根据类的属性来确定的,而不是根据引用。

为了实现这一点,case类会自动生成equals()方法,该方法会比较两个对象的属性是否相等。这样,我们就可以通过调用equals()方法来比较两个case类的实例是否相等,而不需要手动比较每个属性。

重写equals()方法的好处是可以确保在比较对象相等性时,按照我们的预期进行比较。这样可以提高代码的可读性和可维护性,同时也符合面向对象的设计原则。

对于case类,除了重写equals()方法,还需要重写hashCode()方法。hashCode()方法用于计算对象的哈希值,而在Java中,如果两个对象的equals()方法返回true,那么它们的hashCode()方法应该返回相同的值。这是为了保证在使用哈希表等数据结构时,能够正确地找到对象。

总结起来,case类要求重写equals()方法是为了确保按照预期比较对象的相等性,提高代码的可读性和可维护性。同时,还需要重写hashCode()方法,以保证在使用哈希表等数据结构时能够正确地找到对象。

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

相关·内容

为什么重写equals必须重写hashCode

o.hashCode() : 0; } 2为什么要重写equals 通过以上代码可以看出,Object提供的equals在进行比较的时候,并不是进行值比较,而是内存地址的比较。...由此可以知晓,要使用equals对对象进行比较,那么就必须进行重写equals。...3重写equals不重写hashCode会存在什么问题 我们先看下面这段话 每个覆盖了equals方法的类中,必须覆盖hashCode。...那么这样就可以推测出,如果我们重写了equals但是没重写hashCode,那么可能存在元素重复的矛盾情况。...---- 接下来我们打开hashCode的注释代码,看看执行结果 4总结 如果重写了equals就必须重写hashCode,如果不重写将引起与散列集合(HashMap、HashSet、HashTable

1K20
  • 为什么在重写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。

    69721

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

    前言 在Effective Java中第九条规定在覆盖equals()方法时总要覆盖hashCode()方法。这是为什么呢?接下来我们就介绍一下这两个方法。...如果两个对象通过equals方法比较是相等的,那么要求这两个对象的hashCode方法返回的值也应该是相等的。...如果你不将自定义的类定义为HashMap的key值的话,那么我们重写了equals方法而没有重写hashCode方法,编译器不会报任何错,在运行时也不会抛任何异常。...如果你想将自定义的类定义为HashMap的key值得话,那么如果重写了equals方法那么就必须也重写hashCode方法。...接下来我们可以看一下我们使用自定义的类作为HashMap的key,并且自定义的类不重写equals和hashCode方法会发生什么。

    1K10

    为什么要重写 hashCode 和 equals 方法?

    为什么要重写 equals 和 hashCode 方法 当我们用 HashMap 存入自定义的类时,如果不重写这个自定义类的 equals 和 hashCode 方法,得到的结果会和我们预期的不一样。...其实出现这个情况的原因有两个: 没有重写 hashCode 方法 没有重写 equals 方法。...但是我们没有在 HashMapKey 里重写 hashCode 方法,所以这里调用的是 Object 类的 hashCode 方法,而 Object 类的 hashCode 方法返回的 hash 值其实是...由于我们在 HashMapKey 对象里没有定义 equals 方法,系统就不得不调用 Object 类的 equals 方法,同理由于 Object 的固有方法是根据两个对象的内存地址来判断,所以 k1...和 k2 一定不会相等,这就是为什么通过 map.get(k2) 依然得到 null 的原因。

    52120

    为什么重写equals()方法时必须重写hashCode()方法【详解】

    一、为什么重写equals()方法时必须重写hashCode()方法 1、关于hashCode()的约定 hashCode()方法源码注释: If two objects are equal according...); 3、为什么一定要使用 hashcode() 方法 根本原因是为了提升程序运行效率; hashCode()方法返回一个hashCode值,实际上就是一个int整数; hashCode值的作用是确定该对象在哈希表中的索引位置...()的次数,提升了程序运行效率; 简而言之,重写hashcode()方法的目的就是:保证使用equals()方法比较相同的对象,所对应的hashCode值也相同的; 4、HashMap结构 参考文章:...(student.name) && this.age == student.age; } // 我这里使用idea一键重写了,具体该怎么重写hashCode()方法、有什么规则,暂不讨论...hashCode()方法,下面两个int值是不同的,因为Object类默认实现的hashCode()方法是根据对象所存储的的堆内存地址计算出来的,既然是两个对象堆内存地址自然不同,因此hashCode不同

    9010

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...在其中的第2到第18行,我们定义了一个Key类;在其中的第3行定义了唯一的一个属性id。当前我们先注释掉第9行的equals方法和第16行的hashCode方法。...原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...由于我们在Key对象里没有定义equals方法,系统就不得不调用Object类的equals方法。...对面试问题的说明 由于在项目里经常会用到HashMap,所以我在面试的时候一定会问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?

    43530

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 3. 对面试问题的说明 ---- 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过。...为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...由于我们在Key对象里没有定义equals方法,系统就不得不调用Object类的equals方法。...对面试问题的说明 由于在项目里经常会用到HashMap,所以我在面试的时候一定会问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?

    40010

    为什么要重写hashcode和equals方法?

    为什么要重写hashcode和equals方法?...重写equals方法是认为在名字和年龄不为空的情况下,名字相等并且年龄也相等,那么就认为这是同一个对象。...对于两个对象,Java要求如下: equals()相等,hashcode()一定相等; quals()不等,hashcode()可能相等,也可能不等; hashcode()不等,一定能推出equals(...如果不重写hashcode和equals方法的话,放入相同的key时(特殊情况下),就不知道取哪一个。...,总结里的两点当时说得没错,但是不太好理解; 重写hashcode和equals方法的原因有两个: 1、因为 在hashmap中不论是put还是get操作会用到这两个方法; 2、Java规范的约定,在集合类中需要重写这两个方法

    3.1K100

    为什么要重写hashCode()和equals()方法

    为什么要重写hashCode() 在HashMap中key值存放自定义对象来测试一下。...我们再来运行一下刚才的代码,结果为:null 这是因为没有重写equals()方法 为什么要重写equals() HashMap是通过链地址法解决哈希冲突,在5这个位置上存在着myClass1和myClass2...两个对象,这只能说明他们两个的哈希值相同但是不能说明他们两个就是相同的,这时就要调用equals()方法,由于我们没有重写equals()方法,所以会调用Object的equals()方法,Object...) obj).getA()); } } 重写equals()后再运行刚才的代码 当在HashMap中的key存放的是自定义对象时一定要重写hashCode()和equals()方法 如何重写hashCode...() 如果类中只有一个属性直接返回即可,但是如果有多个属性就要用到别的方法: 第一步:定义一个初始值,一般来说取17 int result = 17; 第二步:分别解析自定义类中与equals方法相关的字段

    46110

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...在其中的第2到第18行,我们定义了一个Key类;在其中的第3行定义了唯一的一个属性id。当前我们先注释掉第9行的equals方法和第16行的hashCode方法。...原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...由于我们在Key对象里没有定义equals方法,系统就不得不调用Object类的equals方法。...对面试问题的说明 由于在项目里经常会用到HashMap,所以我在面试的时候一定会问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?

    64020

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...其原因就是没有重写Key对象的equals方法。 HashMap是用链地址法来处理冲突,也就是说,在100号位置上,有可能存在着多个用链表形式存储的对象。...由于我们在Key对象里没有定义equals方法,系统就不得不调用Object类的equals方法。...对面试问题的说明 由于在项目里经常会用到HashMap,所以我在面试的时候一定会问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?

    38620

    为什么要重写hashcode和equals方法?

    为什么要重写hashcode和equals方法?...重写equals方法是认为在名字和年龄不为空的情况下,名字相等并且年龄也相等,那么就认为这是同一个对象。...对于两个对象,Java要求如下: equals()相等,hashcode()一定相等; quals()不等,hashcode()可能相等,也可能不等; hashcode()不等,一定能推出equals(...如果不重写hashcode和equals方法的话,放入相同的key时(特殊情况下),就不知道取哪一个。...,总结里的两点当时说得没错,但是不太好理解; 重写hashcode和equals方法的原因有两个: 1、因为 在hashmap中不论是put还是get操作会用到这两个方法; 2、Java规范的约定,在集合类中需要重写这两个方法

    1.2K20

    面试官:为什么重写 equals 同时要重写 hashCode? 我:…

    重写equals是为了在业务逻辑上判断实例之间是否相等。重写hascode是为了让集合快速判重。...当使用自定义类作为HashMap的Key时put时 如果只重写equals不重写hashCode会出现逻辑错误 先看下面的代码: public class Test { static class Order...这就是为什么当使用自定义对象作为HashMap的Key时如果重写了equals要同时hashCode。 反过来说:重写了hashCode,equals需要重写吗? 答案是要的,都要重写!...还有在map.get(key)时也是一样都会根据hashCode找,再判断equals。 为什么要判断equals呢?...因为根据hashCode找到的是一个链表,需要根据equals在链表中找到Key相等的那个值。 什么场景会用到自定义类做key? 最常见的key是一个坐标,比如说在地图的某个坐标放置一个物体之类的。

    28410

    JAVA中重写equals()方法为什么要重写hashcode()方法说明

    先来个没有重写Code类的hashcode()的例子吧,看看是什么效果: package com.fit; import java.util.HashMap; /** * 身份证类 *  *...HashSet正常存储,要求这个类的两个实例对象用equals()方法比较的结果相等时,他们的哈希码也必须相等;也就是说,如果obj1.equals(obj2)的结果为true,那么以下表达式的结果也要为...如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合中,但是,如果将他们存储进HashSet集合中时...运行结果:size:2 为什么会是2呢?...,在比较equals方法,因为equals返回false,所以r1和r4不相等,同一r2和r4也是不相等的,r3和r4也是不相等的,所以r4可以放到set集合中,那么结果应该是size:4,那为什么会是

    1.1K10
    领券