hashCode、equals的使用
时间:2022-06-13
本文章向大家介绍hashCode、equals的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
hash code、equals是Java用来比较对象是否相等,下面介绍一下自己在工作中对hash code、equals的使用. 首先介绍下String类中的hashCode、equals方法:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
上面就是String类的hashCode、equals方法,如果两个字符串对象相等,它们的hash code一定相等,Java比较两个对象是否相等,首先比较hash code是否相等,如果相等,再通过equals方法判断是否相等;若hash code不等,两个对象肯定不等. CollectionUtils提供的方法非常方便我们对集合的操作:
List<String> aList = new ArrayList<String>();
aList.add("l");
aList.add("i");
List<String> bList = new ArrayList<String>();
bList.add("o");
bList.add("i");
List<String> abList = (List<String>) CollectionUtils.subtract(aList,bList);
abList.stream().forEach(System.out::println);
List<Integer> cList = new ArrayList<Integer>();
cList.add(1);
cList.add(2);
List<Integer> dList = new ArrayList<Integer>();
dList.add(1);
dList.add(3);
List<Integer> cdList = (List<Integer>) CollectionUtils.subtract(cList,dList);
cdList.stream().forEach(System.out::println);
上面打印出来的结果应该不出所料:l、2,由于String、Integer重写了Object的hashCode、equal方法,如果集合中存的是自定义对象,结果又是如何呢:
List<UserInfoEntity> eList = new ArrayList<>();
eList.add(new UserInfoEntity().setMobile("1").setName("w"));
eList.add(new UserInfoEntity().setMobile("3").setName("l"));
List<UserInfoEntity> fList = new ArrayList<>();
fList.add(new UserInfoEntity().setMobile("1").setName("w"));
fList.add(new UserInfoEntity().setMobile("5").setName("p"));
List<UserInfoEntity> efList = (List<UserInfoEntity>) CollectionUtils.subtract(eList,fList);
efList.stream().forEach(System.out::println);
UserInfoEntity:
public class UserInfoEntity{
private String name;
public String getMobile() {
return mobile;
}
public UserInfoEntity setMobile(String mobile) {
this.mobile = mobile;
return this;
}
private String mobile;
public String getName() {
return name;
}
@Override
public String toString() {
return "name="+getName()+",mobile="+getMobile();
}
public UserInfoEntity setName(String name) {
this.name = name;
return this;
}
}
结果却出乎所料,原因在于我们没有重写Object的equals、hashCode方法,按照实际需要重写即可:
@Override
public int hashCode() {
return name.length() * 31 + mobile.length();
}
@Override
public boolean equals(Object obj) {
UserInfoEntity otherObj = (UserInfoEntity) obj;
if (this.getMobile().equals(otherObj.getMobile()) && this.getName().equals(otherObj.getName())) {
return true;
}
return false;
}
对于hashCode方法,重写equal方法,一定要重写hashCode方法,在集合HashSet中存储的元素不能相同,所以操作时需要注意.
- 洛谷P2676 超级书架
- 洛谷P1720 月落乌啼算钱
- 2017.10.1解题报告
- 这个包绝对值得你用心体验一次!
- Python之函数的进阶(带参数的装饰器)
- 2017.10.2解题报告
- MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具集成Visual Studio 2013
- 左手用R右手Python系列——百度地图API调用与地址解析/逆解析
- OpenCV实战:人脸关键点检测(FaceMark)
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
- 模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
- 洛谷P1311 选择客栈
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 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 数组属性和方法
- 一文搞定冒泡排序算法
- 剑指Offer LeetCode 面试题25. 合并两个排序的链表
- LeetCode 20200601 打卡 1431. 拥有最多糖果的孩子
- 剑指Offer LeetCode 面试题24. 反转链表
- 剑指Offer LeetCode 面试题22. 链表中倒数第k个节点
- 剑指Offer LeetCode 面试题18. 删除链表的节点
- 剑指Offer LeetCode 面试题06. 从尾到头打印链表
- 最详细的docker中安装并配置redis
- 剑指Offer LeetCode 面试题59 - I. 滑动窗口的最大
- 剑指Offer LeetCode 面试题58 - II. 左旋转字符串
- 剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II
- 站在软件工程的角度重新思考面向对象(含高清图谱)
- 剑指Offer LeetCode 面试题57. 和为s的两个数字
- 白嫖Layui树型可折叠,可自定义,可搜索表格的实例