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方法的重写 的相关文章

随机推荐

  • 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