toString、hashCode、equals的重写原因与重写示例

详解 方法的覆盖 —— toString() 与 equals()的覆盖 在学习本篇博文前,建议先学习完本人的博文——《工具的抽象与分层——继承(下)》 在本人之前的博文中曾讲过“基类”的知识,那么,本篇博文中的主题——Object类 和 基类的知识就密切相关了,那么,我们就直接进入主题吧。 Object类 是JAVA所提供的一个类类型,且是 所有类的基类。 因为所有类都继承于 Object类,所以,Object类的方法 自然而言就成为 其他类的方法。 而这些方法,... 阅读详情
2009-02-19 16:03

    问题一:我们自定义类中的toString()、hashCode()和equals(Object obj)均继承自Object,其中equals()方法是比较两对象的地址是否相同,hashCode()方法返回的是该对象本身的内存地址。但这个需 求不能满足我们的需求。如问题二。(JDK中其它类都已重写了上述方法,不作考虑)

    问题二:在我们往HashSet中添加自定义对象的时候(HashSet中不能添加相同的对象),HashSet会先将已存在的对象与欲添加的对象进行一 一对比,相同的对象不允许再添加。其比较规则为:如果两对象的hashCode()方法返回值不一样,肯定不是相同的对象,可添加;如果 hashCode()一样,则再判断equals()返回是否为真,不为真则肯定不是相同的对象,可添加,为真由证明两对象完全相同,不再添加到 HashSet中。那按Object()中的hashCode()方法,则只要内存不一样,则两对象的hashCode就不一样,则认为两对象不相同,可 往HashSet中添加,这违背了我们实际需求。

    结论:我们自定义类如果想往HashSet等集合中添加时,必须重写equals(Object obj)和hashCode()方法,使相同内容的对象其equals(Object obj)为真,返回的hashCode()一致。如下:

public class Stu {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
  
   if(!(obj instanceof Stu)){
    return false;
   }
   if(obj==null){
    return false;
   }
   Stu tmp=(Stu)obj;
   if(tmp.age!=this.age && !tmp.name.equals(this.name)){
    return false;
   }
   return true;
}
@Override
public int hashCode() {
   return this.age*this.name.hashCode();
}
public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
public int getAge() {
   return age;
}
public void setAge(int age) {
   this.age = age;
}
}

测试类:
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
   Stu s1=new Stu();
   s1.setAge(18);
   s1.setName("abc");
   Stu s2=new Stu();
   s2.setAge(18);
   s2.setName("abc");
   System.out.println(s1==s2);
   System.out.println(s1.equals(s2));
   HashSet set=new HashSet();
   set.add(s1);
   set.add(s2);
   System.out.println(set.size());
}
}

在上面的测试中两对象的年龄与姓名均一致,但其内存地址不一样。所以用"=="为假,用equals为真,返回的set.size()为1,即往HashSet中只能添加进一个对象。至于toString()方法较为简单,不多说了……

RK3308B开发板WiFi+蓝牙一体模组RTL8821CS驱动移植保姆级教程(含DTS配置与避坑点) 本文提供RK3308B开发板RTL8821CS WiFi+蓝牙模组驱动移植的完整教程,涵盖SDK环境配置、DTS设备树设置、内核编译优化及功能验证全流程。重点解析引脚复用冲突、电源管理等关键配置,并给出常见错误解决方案,帮助开发者快速实现双模通信功能。 阅读详情

相关推荐

机器学习预测土壤养分:从电导率、pH到随机森林与神经网络的农业实践

在智慧农业与精准农业领域,机器学习已成为处理复杂农业数据、挖掘潜在规律的关键技术。其核心原理在于通过算法从多维数据中自动学习特征与目标变量之间的映射关系,尤其擅长捕捉非线性关联。这项技术的核心价值在于能够将传统上依赖昂贵、耗时实验室分析的问题(如土壤养分检测),转化为基于易获取传感器数据(如电导率、pH值)的快速、低成本预测任务,为农业生产的实时决策与资源优化提供了全新可能。其典型应用场景包括作物生长监测、产量预测以及精准施肥管理等。本文聚焦于利用随机森林和神经网络等回归算法,构建通过土壤物理参数预测氮磷钾

weixin_33693070的博客 667

equal(),hashcode(),toString()方法的作用

这三个方法都是java.lang.Object的方法。 equal();判断两对象是否相等 hashcode();为对象在容器中添加一个标识; toString();把对象转成字符串;   重写equal 的同时为什么必须重写hashcode? 注意:当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有

空杯心态_虚怀若谷 543

FIFO应用于UART串口(含代码)

FIFO(First in first out)即先入先出,可以把它理解成一个缓存器,对于收发两端速度不一致,位宽不一致的情况可以使用FIFO作为收发两端中间的“调节剂”使数据可以进行正常发送。

m0_58544042的博客 2753

java基础(关于重写hashcode,equals,toString方法)

按照java开发的既定规范,任何和数据有关的类定义都需要重写三个方法: 1、hashcode 2、equals 3、toString 同时实现这三个方法有一个要求,既是,被定义为相同数据的两个对象,这三个方法表现必须一致:既是 如果a.equals(b)==true的情况下,a.hashcode()==b.hashcode()返回true;a.toString()==b.toString()也要返...

qq_34697203的博客 533

TS808效果器制作教程

TS808效果器制作教程 可以在立创商城购买到大部分的电阻电容和IC,音频接口,踩钉,电位器和电源接口可以去某宝看看都买得到的。链接https//pan.baidu.com/s/1QId1eIE3fJ2u5NLBSISvGA。安装过程过于繁琐,把所有元器件按照图纸焊接完成就可以调试了,祝你们成功!这是TS808经典效果器制作过程的记录。IC是JRC4558。...

qq_18948149的博客 3427

导带、价带

价带是电子的“束缚态”能量区间,决定材料的化学性质;导带是电子的“自由态”能量区间,直接决定材料的导电能力;禁带宽度则是区分金属、半导体与绝缘体的核心参数。通过调控能带结构(如掺杂、应变工程),可设计出具有特定电学和光学特性的功能材料,推动电子信息、能源转换等领域的技术革新。

weixin_51552564的博客 5117

重写hashcode

方法时,要确保在比较中使用的字段都是参与到哈希计算中的。如果两个对象的内容相同,它们的哈希码应该相同,这有助于在哈希表等数据结构中准确地定位对象。方法时,通常是因为你希望在判断两个对象是否相等时能够正确地比较它们的内容,而不仅仅是比较它们的引用。下面是一个典型的重写。你可以根据需要调整这些值,但是通常选择奇素数可以减少哈希冲突的可能性。方法,以确保在比较对象相等性时一致性得到维持。在这个例子中,我们使用了一种常见的。计算方法,其中选择了初始值。方法的同时,也要一并重写。当你需要重写一个类的。

m0_57969579的博客 334

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1440

hashcode重写

/** * 当一个类的实例作为HashMap的key时它的equals方法 * 与hashcode方法的重写直接影响着散列表(HashMap) * 的查询性能 * 在api文档中object对这两个方法的重写做了说明 * 当我们重写一个类的equals方法时,就应当连同重写hashcode方法 * 这两个方法重写应当遵循: * 1:一致性,当两个对象的equals比较为true时,h...

qq_42777577的博客 441

[STM32F103C8T6]W5500+Modbus TCP(HAL库)

本章节是博主学习Modbus TCP所写的一篇文章Modbus TCP是Modbus的一个分支,主要用到网口通信的,在工业上也用的很频繁,我们公司最近的项目就是用的W5500+modbus TCP来和PC端的上位机通信和交互的。虽然这个项目不是我在写代码,但是我都学了Modbus RTU了,那我也抽空学习一下Modbus TCP吧。本次的Modbus TCP不是博主写的,是一个大佬开源的一个W5500写的一个Mobus TCP代码,我在这个基础上自己写了主机读从机多个数据,和主机写从机寄存器的函数。

sinat_58149788的博客 4086

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

Object类的toString、==、equals、hashCode方法

当前实例对象重写toString方法是大部分情况是为了输出当前实例对象的内容。

2301_81663239的博客 324

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java】关于equals()和hashCode()

今天看到的第一个问题: String有重写Object类的hashCode()和toString()方法吗? 那写没写我们来看一下呗(看源码什么的最快乐了)。 首先看Object 的toString()方法: public String toString() { return getClass().getName() + "@" + Integer.toHexStri...

Max的专栏 224

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java中Object自带的九个方法,以及重写equals注意事项等

关于object自带的九个方法,以及重写equals注意事项等等

qq_52357485的博客 649

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

需要在子类中进行重写的方法

【代码】需要在子类中进行重写的方法。

Gucci_ma的博客 997

Object类

Object是类的祖宗,除了少数特殊的东西外所有的类都会继承Object类接口,枚举,异常不继承Object类Object类最常用的三个方法:equals,hashCode,toString。

喜欢自己就行了,别喜欢别人 968

Object类下equals和hashCode方法的浅显理解

Object类下equals和hashCode方法的浅显理解

qq_65797079的博客 190

Object类的基础知识

Java 规定:所有类都直接或间接继承自 类。即使你定义类时没有显式写 (例如 ),编译器也会默认加上这层继承关系。 类中定义了一些所有对象都需要的基础方法,最常用的有::返回对象的字符串表示(默认是 ,通常需要重写)。:判断两个对象是否 “相等”(默认比较内存地址,通常需要重写)。:返回对象的哈希码(与 配合使用,用于哈希表等场景)。:返回对象的运行时类(用于反射操作)。:创建并返回对象的副本(实现对象克隆)。//:用于多线程间的通信协作。 类的存在是为了给所有 Java 对象提供统一的基础行为,保证

2303_81937027的博客 711

Java Object类核心方法解析与最佳实践

在面向对象编程中,Object类是所有类的基类,定义了对象的基本行为。Java通过隐式继承机制确保所有类都继承自Object类,这为对象模型提供了统一的基础契约。理解Object类的核心方法(如equals、hashCode、toString)对于编写健壮代码至关重要,特别是在处理集合框架和并发编程时。这些方法直接影响HashMap等容器的性能表现,也关系到多线程环境下的对象同步机制。通过合理重写这些方法,开发者可以优化对象比较、哈希计算和调试输出等常见场景。本文结合JDK源码和实际案例,深入剖析Objec

angou6476的博客 309

【Javase 关于Object的常见问题】

文章摘要:本文探讨了Java中四个核心概念:1) ==与equals的区别:==比较基本类型的值和引用类型的地址,equals默认比地址但常被重写为比内容;2) 重写equals必须重写hashCode,否则违反Java约定导致哈希集合出错;3) toString建议重写以显示对象属性而非默认无意义的地址;4) hashCode相同equals不一定为真(哈希冲突),但equals为真时hashCode必定相同(Java强制约定)。通过代码示例清晰展示了各概念的实际应用场景和注意事项。

gzh070923的博客 220

04 面向对象:Object类、equals重写、final关键词、抽象类和抽象方法、接口、对象转型

1

亲爱的瑶的博客 194

Java 基础 | Object 源码解析

点赞再看,养成习惯,公众号搜一搜【一角钱技术】关注更多原创技术文章。 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章。 前言 Java 是一门面向对象的语言,在 Java 里面一切都可以看作是一个对象,而 Java 里面所有的对象都默认继承于 Object 类。 本文基于JDK1.8 可以看到一共12个方法,其中 registerNatives() 是 native 修饰的,一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用。 ge..

org_hjh的博客 208

Java Object 类笔记

因为String底层使用final修饰的char[]数组存储字符。数组本身不可变,且String类没有提供修改数组内容的方法,所有“修改”操作都会返回新对象。Java Object 类深度解析这种设计带来了线程安全、字符串常量池复用、哈希值缓存等好处。Object类是 Java 的根类,掌握其核心方法是理解 Java 面向对象的基础。equals和hashCode的约定是哈希集合正确工作的关键。String的选择直接影响程序性能和线程安全性。

2301_82251392的博客 373

Object 类

什么是Object 类 Object 类: 是所有类的顶层父类,所有类都是直接或间接继承自他 Object 类中的常用方法 public int hashCode () 获取返回其所在对象的哈希码值(物理地址); public final Class getClass () 返回一个Class对象 当这个字节码文件加载进内存后,然后JVM会为字节码文件创建一个对象---->我可以通过getC...

空空少年郎的博客 223

Java基础面向对象(常用类)

"男" : "女") + ",score:" + score;Student s1 = new Student("张三", 20,true, 99.5,new Teacher("lisi",30));Student s2 = new Student("张三", 20, true,99.5,new Teacher("lisi",30));Student s1 = new Student("张三", 20,true, 99.0,new Teacher("lisi",30));

m0_67244960的博客 756
上一篇: 开发人员一定要加入收藏夹的23个网站
下一篇: Linux启动过程剖析
jackoo
博客等级 码龄18年 5粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值