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()方法较为简单,不多说了……

Pytest教程:Pytest插件原理 Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。 阅读详情

相关推荐

RiscV运行zephyr和Linux的方法

riscv基金会搞了一个网站,用于介绍如何使用riscv指令集进行开发。 对于运行zephyr和linux以及Qemu有非常大的帮助。 可以作为riscv开发的相关参考。 RISC-V - Getting Started Guide — RISC-V - Getting Started Guidehttps://risc-v-getting-started-guide.readthedocs.io/en/latest/index.html RISC-V - Getting Started Gu.

闲人的专栏 737

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

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

空杯心态_虚怀若谷 543

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7618

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

MinerU PDF解析工具:从安装配置到本地部署与API调用的全流程指南

MinerU是由上海人工智能实验室开源的高质量PDF解析工具,可将包含图片、公式、表格的复杂PDF转换为Markdown和JSON格式。安装前需准备Python 3.10-3.13环境,推荐使用8核CPU和32GB内存。支持通过HuggingFace或ModelScope下载模型,国内用户建议使用ModelScope源加速下载。配置文件中可设置本地模型路径,支持多种语言识别和两种解析后端(Pipeline和VLM)。输出包含可视化文件、内容文件和中间结果文件,并提供了完整的Python API调用示例。

算法工程师 2027

有限元分析-静力学分析-与分析解对比-——以阶梯轴的静力分析为例——静态结构分析

150mm,a=300mm{a=300mm}a=300mm,b=200mm{b=200mm}b=200mm,L=1000mm{L=1000mm}L=1000mm,F=300kN{F=300kN}F=300kN,材料为45,弹性模量E=2.1e11Pa{E=2.1e11Pa}E=2.1e11Pa,泊松比v=0.28{v=0.28}v=0.28,屈服应力δs=355MPa{δ_s=355MPa}δ。使用line body生成的模型,可以选择自动划分网格的,WB会将以梁单元将其划分完成,例如图2所示。

qq_15963745的博客 66

重写hashcode

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

m0_57969579的博客 334

【图像去噪】论文精读:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising

论文题目:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising —— AKDT:用于有效图像去噪的自适应核膨胀Transformer图像去噪是一项基本但具有挑战性的任务,特别是在处理高分辨率图像和复杂的噪声模式时。大多数现有方法依赖于标准的 Transformer 架构,该架构通常计算复杂度高,并且对不同噪声水平的适应性有限。在本文中,我们介绍了自适应核膨胀Transformer(AKDT)

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1046

hashcode重写

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

qq_42777577的博客 441

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 437

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

王老师青少年编程 791

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

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

2301_81663239的博客 324

Rcpp简介

在数据分析时,代码的运行速率常常是我们所关心的话题之一。小Q往期的文章中也有介绍通过并行计算提升R运行速率的文章。然而R代码自身的运行速率偏慢,具有某种“先天缺陷”。因此,并行R函数的运行时间有时仍然不尽人意。本期小Q与大家分享R的另一提速方式:Rcpp之效率瓶颈突破。 1 什么是Rcpp 在往期的文章中曾讲过,我们在R中尽量采用向量化或内建函数运算,避免自编循环带来的额外时间消耗。然而,算法中有时难以避免循环,若循环部分耗时严重,直接并行含有该循环的算法显得力不从心,此时又该如何?稍有编程知识的读者可

Mrrunsen的博客 2262

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

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

Max的专栏 224

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

qq_52357485的博客 649

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

Gucci_ma的博客 997

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值