equals和hashcode重写的问题
2024-10-15 08:16:05
public static void main(String[] args) {
Set<Test> set = new HashSet<>();
Test t1 = new Test("aaa");
Test t2 = new Test("aaa");
set.add(t1);
set.add(t2);
System.out.println(set.size());
//我们对于equals方法已经很熟了,这里就不说了
//t1.equals(t2) == true
//如果Test没有重写hashcode方法 set.size() -> 2
//如果Test重写了hashcode方法 set.size() -> 1
//原因:
//在集合中,判断两个对象是否相等的规则是:
//第一步,如果hashCode()相等,则查看第二步,否则不相等;
//第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等
//hashcode源码分析:String类的
//实际上它是遍历了字符串的里面的所有字符,根据每个字符的ASCII码值进行遍历计算,关于那个固定值为什么是31,应该取这个值效率较高,可重复性较低
/*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;*/
//equals源码分析:string类
//这个相信大家都看过,遍历字符串里的所有字符,然后逐一进行比较,只要有不相同的就return false
//所以
//equals相同的两个对象,其hashcode码一定相同,因为hashcode码就是根据值去算的
//两个对象的hashcode码相同,可能存在偶然的情况,字符串不同,算出的hashcode码一样
}
最新文章
- CSS基本知识2-CSS选择
- SpringMVC使用@PathVariable,@RequestBody,@ResponseBody,@RequestParam,@InitBinder
- Linux运维初级教程(一)Shell脚本
- 讨论贴:在sp_executesql 中生成的临时表的可见性
- Unity5.3官方VR教程重磅登场-系列2
- [转]何时使用委托而不使用接口(C# 编程指南)
- tomcat version
- Qt之进程间通信(QProcess)
- 实例源码--Android简单团购应用源码
- CV牛人牛事简介之一
- Unity定时器
- 队列的实现(JAVA)
- js遍历对象的属性并且动态添加属性
- vultr新用户注册享受50美元优惠码,长期有效
- Python之登录接口
- Newtonsoft的序列化和反序列化
- PAT L2-011 玩转二叉树
- 自定义git忽略规则
- 阿里历年经典Java面试题汇总,想进BAT你还不快收藏!
- windows服务器开启openssl