Object.equals方法的重写

2023-11-16

简要说明下:

重写equals,一般都需要重写Object.hashCode方法,因为ObjectA.equals(ObjectB)时,按理说:ObjectA.hashCode() == ObjectB.hashCode()。

但是重写equals,不重写hashCode方法,会导致2个Object相等了,但是hashCode不等,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

代码:

比如,构建一个people类,比较2个people类是否相等

1、构建people类

public class People {
	private String s1;
	private int hash = 0;

	public String getS1() {
		return s1;
	}

	public void setS1(String s1) {
		this.s1 = s1;
	}

	/**
	 * @param s1
	 */
	public People(String s1) {
		super();
		this.s1 = s1;
	}
}

2、 重写equals方法

public class People {
	private String s1;
	private int hash = 0;

	public String getS1() {
		return s1;
	}

	public void setS1(String s1) {
		this.s1 = s1;
	}

	/**
	 * @param s1
	 */
	public People(String s1) {
		super();
		this.s1 = s1;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof People && this.s1 != null && obj != null) {
			char[] cs = this.s1.toCharArray();

			int count = 0;
			while (count < cs.length) {
				if (cs[count] == ((People) obj).getS1().charAt(count)) {
					count++;
					continue;
				}
				return false;
			}

			return true;
		} else {
			return false;
		}
	}
}

 3、重写hashCode方法,然后测试

public class People {
	private String s1;
	private int hash = 0;

	public String getS1() {
		return s1;
	}

	public void setS1(String s1) {
		this.s1 = s1;
	}

	/**
	 * @param s1
	 */
	public People(String s1) {
		super();
		this.s1 = s1;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof People && this.s1 != null && obj != null) {
			char[] cs = this.s1.toCharArray();

			int count = 0;
			while (count < cs.length) {
				if (cs[count] == ((People) obj).getS1().charAt(count)) {
					count++;
					continue;
				}
				return false;
			}

			return true;
		} else {
			return false;
		}
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		if (hash == 0) {
			char[] cs = this.s1.toCharArray();

			for (int i = 0; i < cs.length; i++) {
				hash += i * 31 + cs[i];
			}
		}
		return hash;
	}

	public static void main(String[] args) {
		People p1 = new People("w11kk");
		People p2 = new People("w11kk");

		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());
		System.out.println(p1.equals(p2));
	}
}

4、得出的结果为:

741
741
true

结果和预期的一样,起始重写这2个方法比较灵活,equals达到自己想要的预期效果就行,hashCode保证不同的Object,equals时,hashCode也需要相同

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Object.equals方法的重写 的相关文章

  • 如果在 addHeader 之前写入正文,HttpServletResponse 会丢失标头吗?

    环境 Java HotSpot TM 64 位服务器 VM 内部版本 16 3 b01 混合模式 tomcat6 当我使用HttpServlet发送html页面时 如下所示 resp getWriter append body body i
  • 如何在JavaFX中有效地滚动和缩放大图像?

    作为图像处理应用程序的一部分 我需要创建具有缩放 滚动和矢量叠加功能的简单查看器模块 图像相当大 40000x20000 这使得 ImageView 上的操作变慢 缓冲等 在 JavaFX 中处理巨大图像时 改善用户体验的最佳选项是什么 我
  • Java:while循环冻结程序

    我正在制作一个游戏 我需要每 3 秒更新一次 JProgressBar 为此 我使用 while 循环 问题是我的程序由于 while 循环而冻结 我在其他问题中读到它 他们没有帮助我解决这个问题 我不知道如何解决 这是我的代码 publi
  • 从另一个进程捕获 system.out 消息

    我有一个 JVM 1 它启动 JVM 2 我希望能够在 JVM 1 中监视来自 JVM 2 的 System out println 调用 直接的方法是 JVM A 执行系统命令来启动 JVM B 然后 JVM A 读取 B 的所有输出 S
  • 如何将完整的日期格式拆分为日期和时间?

    我有很多格式为我的示例所示的字符串 我必须解析它们 我正在尝试确定今天是哪根弦 我的问题是 时间快到了 我只需要比较那个日期 接下来我想检查时间是否在 after 和 before 的两个时间戳 HH mm ss 之间 但存在问题 日期几乎
  • 在 json 中解析尾随字符

    我正在尝试检查 json 是否有效 并且我遇到了奇怪的行为 当我将一些字符附加到可解析的 json 时 jackson 和 gson 都会解析它 并且它们会忽略尾随字符 我想检查 json 是否严格有效 请帮忙 我尝试了几个标志mapper
  • AMQP Spring 集成错误处理

    我的集成流程如下所示 Bean public IntegrationFlow auditFlow Qualifier eventLoggingConnectionFactory ConnectionFactory connectionFac
  • WSDL2Java 抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java

    我正在尝试从远程 Web 服务创建 java 文件 我下载了axis 1 4 将lib文件夹复制到c data axis lib其中包含这些文件 axis jar 轴 ant jar commons discovery 0 2 jar co
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • Eclipse 无法识别 persistence.xml 的内容

    我在 eclipse 中收到以下错误 persistence xml 文件没有可识别的内容 我的 persistence xml 文件在我的应用程序中工作得很好 但 eclipse 一直给我这个错误 我在移动文件并使用 m2eclipse
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • Java 8 Stream - 并行执行 - 不同的结果 - 为什么?

    假设我有一个List
  • 将 Maven 控制台与 m2eclipse 一起使用

    Maven 新手在这里 有没有办法在 Eclipse 中打开控制台并在 M2Eclipse 插件上执行 Maven 命令 这是一个非常好的插件 但我环顾四周 没有找到我想要的一些功能 谢谢 如果你想运行特定的maven插件 你可以这样做 g
  • 在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

    有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
  • Web 服务客户端的 AXIS 与 JAX-WS

    我决定用Java 实现Web 服务客户端 我已经在 Eclipse 中生成了 Axis 客户端 并使用 wsimport 生成了 JAS WS 客户端 两种解决方案都有效 现在我必须选择一种来继续 在选择其中之一之前我应该 考虑什么 JAX
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 在Java内存管理中,“PS”代表什么?

    每当我看到 Java 中对内存的引用时 各种空格总是以 PS 为前缀 PS 是什么意思 它开始困扰我 到目前为止我唯一的猜测是 泳池空间 但这将是多余的 例子 PS伊甸园空间 PS 幸存者空间 PS 终身空间 老一代 PS Perm Gen
  • java中什么是静态接口?

    我正在阅读Map Entry界面 当我注意到它是一个static界面 我不太明白什么是静态接口 它与常规接口有什么不同 public static interface Map Entry
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request

随机推荐

  • Latex Picture And Table Setting

    Four Picture in one column begin figure htb begin minipage b 48 linewidth centering centerline includegraphics width 4 0
  • C++11常用新特性汇总

    感谢博主的分享 转载自 http www cnblogs com feng sc p 5710724 html C 11已经出来很久了 网上也早有很多优秀的C 11新特性的总结文章 在编写本博客之前 博主在工作和学习中学到的关于C 11方面
  • java字符串定长前面填充0

    Java中在数字前自动补零方法 public class TestTest public static void main String args 方法一 0 代表前面补充0 4 代表长度为4 d 代表参数为正数型 System out p
  • System V 共享内存

    System V 共享内存 共享内存是什么 如何使用共享内存 ftok shmget shmat shmdt shmctl 共享内存的原理 共享内存实现两个进程间通信 共享内存的特点 共享内存与管道配合使用 两个进程间通信 多个进程间通信
  • CentOS 7安装谷歌浏览器Chrome失败

    问题描述 CentOS 7安装谷歌浏览器Chrome失败 安装上但是点击图标加载但是打不开 谷歌官网下载地址 https www google cn intl zh CN chrome 初步解决 起初我也去搜索了别的博主分享的问题与解决方法
  • linux怎么进入etc目录,Linux 系统的/etc目录

    etc目录下的重要文件 etc sysconfig network 指定服务器上的网络配置信息 etc rc d init d network 网络配置脚本信息 网络配置脚本 开机经过脚本文件来读取相应的配置文件 提供初始化设置 经过 et
  • Origin 2017 给曲线加标记符号

    最近在用Origin 2017画曲线图 需要给图像得曲线加上不同得标记符号用以区分 把操作步骤记录下来 免得忘了 1 用Origin 2017打开一个曲线图 在任意一条曲线上点击右键弹出菜单 选择 绘图更改为 选择 点线图 2 选择之后 可
  • myeclispe

    1 快捷键 ctrl alt h 查哪里调用该方法 ctrl o直接查方法 Ctrl Shift F格式化代码 ctrl f 当前页面快速搜索 ctrl shift r全局搜索类或者 xml文件等 ctrl h file search 全局
  • Springboot程序开启远程DEBUG

    一 远程debug的原理 Spring Boot程序远程debug的原理主要是通过在启动时指定JVM参数来启用远程调试模式 并在调试器中连接到程序所在的调试地址 从而实现对程序的远程调试 具体步骤如下 在运行Spring Boot程序时 在
  • 【2023考研】数据结构常考应用典型例题(含真题)

    前言 本文针对 数据结构 博主花了几天时间列出了考研常考的应用题型 讲解详细 方便复习 各类题型所涉及的知识点包括但不限于队列 二叉排序树 平衡二叉树 哈夫曼树及哈夫曼编码 图的存储 最小生成树 关键路径 排序算法等等 标题即为考点 例题出
  • P1010 [NOIP1998 普及组] 幂次方 递归模拟

    题目描述 任何一个正整数都可以用 2 的幂次方表示 例如 137 2 7 2 3 2 0 同时约定方次用括号来表示 即 a b可表示为a b 由此可知 137 可表示为 2 7 2 3 2 0 进一步 7 2 2 2 2 0 2 1 用 2
  • Macbook air 安装Windows 10 错误:no bootable device insert boot disk and press any key 终极解决办法

    macbook型号 air 2012 当前操作系统 Catalina 安装工具 boot camp assistant 要安装的双系统 windows 10专业版 下载来源于微软官方 出现问题 安装系统时提示 no bootable dev
  • 硬件描述测试软件库中74138,数字系统设计与Verilog HDL课后习题

    习题1 1 1现代EDA技术的特点有哪些 1 2什么是Top down设计方式 1 3数字系统的实现方式有哪些 各有什么优缺点 1 4什么是IP复用技术 IP核对EDA技术的应用和发展有什么意义 1 5用硬件描述语言设计数字电路的优势是什么
  • 关于SQLyog创建的数据库不显示的问题

    最初的问题是这样的 创建了很多数据库 然而只显示一个mysql 用show databases语句 所有的数据库又能显示出来 原因是 创建连接的时候数据 库的那一栏填了mysql 重新创建 不用填写即可 这样就好了 网上搜了好多解决办法 都
  • Sudo 堆缓冲区溢出致本地提权漏洞(CVE-2021-3156)

    1 漏洞描述 2021年1月26日 Sudo发布安全通告 修复了一个类Unix操作系统在命令参数中转义反斜杠时存在基于堆的缓冲区溢出漏洞 当sudo通过 s或 i命令行选项在shell模式下运行命令时 它将在命令参数中使用反斜杠转义特殊字符
  • macbook pro换固态硬盘ssd与移植mac os x系统

    macbook买了一年多了 当时选择了macbook pro 2012 最近一段时间 开机越来越慢了差不多要2分钟 没办法只好给电脑硬盘升级了 准备 1 淘宝上700元左右200多G固态硬盘 2 一个空的移动 1T 硬盘用来系统备份移植 t
  • webpack打包报错:if (!scriptUrl) throw new Error(“Automatic publicPath is not supported in this browser“)

    翻车现场 ERROR in Error D Work test webpack demo 05 打包图片资源 src index html 104 if scriptUrl throw new Error Automatic publicP
  • tq210-kernel 3.0.8 NFS+文件系统

    2016 11 25 kernel 4 1 33的网卡驱动一直没有调通 先放一放 先利用板子带的kernel3 0 8来做个文件系统 busybox 是一个工具箱 单个bin文件实现常用的ls cd 等等命令 堪称瑞士军刀 编译很简单 看看
  • 《C++ primer》练习3.17:改写单词为大写

    最近看 C primer 有这样一个题目 从cin读入一组词并把它们存入一个vector 对象 然后设法把所有词都改写为大写形式 输出改变后的结果 每个词占一行 考察 怎么输入字符串 怎么存入vector对象 怎么对字符串字符处理 代码 i
  • Object.equals方法的重写

    简要说明下 重写equals 一般都需要重写Object hashCode方法 因为ObjectA equals ObjectB 时 按理说 ObjectA hashCode ObjectB hashCode 但是重写equals 不重写h