首页 > 其他分享 >什么时候会重写equals和hashcode方法

什么时候会重写equals和hashcode方法

时间:2023-11-25 22:24:48浏览次数:35  
标签:自定义 对象 equals hashCode 哈希 hashcode 重写

在Java中,通常情况下,当你使用自定义类的实例作为集合的元素、键(key)或者在需要进行对象比较的场景,你可能会需要重写 equals()hashCode() 方法。这两个方法在 Object 类中定义,但默认的实现是基于对象的内存地址,而不是基于对象的内容。通过重写这两个方法,你可以自定义对象相等性的判断和哈希码的生成。

equals() 方法:

  • 用于判断两个对象是否相等。
  • 如果不重写 equals() 方法,它默认是比较对象的引用,即比较对象是否是同一实例。
  • 重写时通常需要考虑对象的内容是否相等,而不仅仅是比较引用。
@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    MyClass myObj = (MyClass) obj;
    // 比较对象的内容,根据实际需要自定义比较逻辑
    return this.field1.equals(myObj.field1) && this.field2.equals(myObj.field2);
}

hashCode() 方法:

  • 用于生成对象的哈希码,通常在集合中使用。
  • 如果不重写 hashCode() 方法,它默认会返回对象的内存地址的哈希码。
  • 重写时通常需要根据 equals() 方法中用于比较的字段来生成哈希码。
@Override
public int hashCode() {
    // 根据对象的内容生成哈希码,根据实际需要自定义生成逻辑
    return Objects.hash(field1, field2);
}
需要重写的场景:
  • 当你希望两个对象在逻辑上相等,即具有相同的业务内容时,需要重写 equals()hashCode() 方法。
  • 在使用集合类(如 HashMapHashSet)存储自定义对象时,通常需要重写这两个方法,以确保对象的唯一性和正确的比较行为。

注意事项:

  • 保持 equals() 方法的传递性、自反性、对称性和一致性。
  • 始终同时重写 equals()hashCode() 方法,以保持它们之间的一致性。
  • 尽量不要使用浮点数进行哈希码的计算,因为浮点数计算可能因为精度问题导致哈希码不稳定。

总体来说,当你希望自定义类的实例在逻辑上相等时,需要考虑重写 equals()hashCode() 方法。这样可以确保对象在集合和散列表等数据结构中的正确行为。

标签:自定义,对象,equals,hashCode,哈希,hashcode,重写
From: https://www.cnblogs.com/guoyu1/p/17856226.html

相关文章

  • PyTorch团队重写「分割一切」模型,比原始实现快8倍
    前言 我们该如何优化Meta的「分割一切」模型,PyTorch团队撰写的这篇博客由浅入深的帮你解答。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署......
  • Nginx实现基于请求URL的请求重写配置
    在Nginx中,可以使用rewrite指令来进行请求重写。其基本语法如下:复制1rewriteregexreplacement[flag];其中,regex表示正则表达式,用于匹配当前请求URL;replacement表示目标URL,替换原来的URL;flag是可选的标志位,用于控制重写的行为。例如,下面的重写规则可以将以“/pa......
  • 我们用goframe重写了FastAdmin的后端,原来这么爽
    时间大约是三年前,当时我所在的团队是最早接触PHP的,而团队其他成员都是用Java。由于某些项目原因,我们决定全面转向使用GO进行开发。在当时,我们并不想花太多时间去折腾REACT和VUE这些前端框架,我们更倾向于使用jQuery来开发,因为我们喜欢它的快感。于是我想到了一个基于Thi......
  • WPF --- 重写圆角DataGrid样式
    引言因要符合UI设计,需要一个圆角的DataGrid样式,其需要一个,所以需要重写DataGrid的样式,代码具体样式代码如下:<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"......
  • WPF --- 如何重写WPF原生控件样式
    引言上一篇中WPF---重写DataGrid样式,因新产品UI需要,重写了一下微软WPF原生的DataGrid的样式,包含如下内容:基础设置,一些基本背景色,字体颜色等。滚动条样式。实现圆角表格,重写表格的一些基础样式,例如CellStyle,RowStyle,RowHeaderStyle,ColumnHeaderStyle等。重写过......
  • 重写Java中Arrays数组工具类提供的sort()排序函数中的比较器类Comparator的compare()
    排序方法是我们日常开发或者写功能函数,或者实现算法时,常调用的方法。有时甚至,开发人员自己还要写一写排序算法。今天,我们来修改Java官方提供的Arrays工具类中的静态排序sort()方法。反问一下,为什么要重写呢?官方提供的还不够你用?回答:确实不够用,官方默认是对数字,特别是sort比较的......
  • vue2为什么只重写了7个数组方法
    首先看源码//即将要被劫持的数组letarr=[1,2,3];//先把要劫持的方法列出来letmethods=["push","pop","shift","unshift","reverse","sort","splice"];//既然要劫持原型,就要先把原型拿过来letarrayProto=Array.prototy......
  • 属性设置了configurable:false,表示该属性不可删除,删改无效,也不可再次修改其特性,但是属
    执行以下程序,下列选项中,说法正确的是()varobj={brand:'华为',price:1999};Object.defineProperty(obj,'id',{value:1})Object.defineProperty(obj,'price',{configurable:false})console.log(Object.keys(obj).length);...①for(varkinobj){con......
  • 【golang】Golang 哈希码 hashcode 输入一个字符串,得到一个唯一标识码
    如何输入一个字符串,得到一个唯一的hashcode?例子如下:packagemainimport("fmt""hash/crc32")//Stringhashesastringtoauniquehashcode.////crc32returnsauint32,butforouruseweneed//andnonnegativeinteger.Herewec......
  • 重写equals方法
    前言:重写equals方法能够学习到多态、instanceof代码实现:publicclassSuper{publicstaticvoidmain(String[]args){Super.User1user1=newSuper.User1();Super.User2user2=newSuper.User2();System.out.println(user2.equals(use......