必须同时重写hashcode和equals方法的原因
时间:2022-07-22
本文章向大家介绍必须同时重写hashcode和equals方法的原因,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在不重写这两个方法时,hashcode是内存地址计算出的值,equals是用==来判断是否相同,也就是根据内存地址判断是不是相同对象。
假如我现在在开发中有一个person类,他有一些属性 如:姓名 年龄 住址。而我逻辑上需要当姓名和年龄都相同时,就认为这是同一个人,也就是同一个对象。那么肯定要重写它的equals方法
class Person{
String name;
String sex;
String address;
//getter setter
@Override
public boolean equals(Person p){
if(this == p) return true;
return (p.getName() == this.name && p.getSex() == this.sex);
}
}
在没有重写hashcode时,对于两个姓名、年龄都相同的person对象,hashcode肯定不同,但是equals却返回true。这里就违反了关于hashcode的约定,也会产生许多问题。
假如当我把很多person对象放入一个hashset集合中时,需要根据姓名和年龄去重。明明两个对象的姓名、年龄相同了,应该被过滤掉,但是由于在add时,两个对象的hash值不同,则不会被去重。就发生了我们认为应该被去重,但是却没有的情况,违背了设计初衷。然而在根据equals需要的属性重写hashcode方法时,保证了equals相同,hashcode一定相同,就可以避免这种错误。
class Person{
String name;
String sex;
String address;
//getter setter
@Override
public boolean equals(Person p){
if(this == p) return true;
return (p.getName() == this.name && p.getSex() == this.sex);
}
@Override
public int hashCode() {
return name.hashCode() + sex.hashCode();
}
}
hash的好处:
假如set集合已经有一万个对象,需要挨个比较的话肯定效率特别低,而hash值就像一张每个人都有的银行卡号,在于众多对象进行比较时,只需要去判断我这个对象的hash值有没有在set中,而不需要去顺序对比,效率很高!
所以两个方法要同时重写的目的就是 要保证equals方法如果返回相同,则hashcode值一定相同
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【动手学深度学习笔记】之对模型参数的访问、初始化和共享
- 【动手学深度学习笔记】之构造MLP模型的几种方法
- 【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
- 【动手学深度学习笔记】之通过权重衰减法解决过拟合问题
- 【动手学深度学习笔记】之多层感知机实现
- Linux程序员效率工具:比man更好用的命令提示工具
- 我对torch中的gather函数的一点理解
- 冒泡排序的实现思路和优化方案
- Java Map转对象
- 59.Vue 使用webpack构建vue项目
- Android初学设置文字跑马灯效果
- 使用Zolom内存解析运行python脚本(不落地)
- 要点3:输入函数对比与自定义输入方式
- 性能测试必备命令(3)- lscpu
- 性能测试必备命令(2)- uptime