今天在群里和大家讨论hashmap的原理,还有些人对方法的hashcode和equal有疑问。花了点时间,简单写了一个demo。
如果hashmap的key是自己定义的对象。
package io.github.xwjie;
public class User{
// FIXME ID 应该加final
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public User(long id) {
this.id = id;
}
@Override
public int hashCode() {
return Long.hashCode(this.id);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof User) {
User anotherUser = (User)anObject;
return this.id == anotherUser.id;
}
return false;
}
}
测试类:
package io.github.xwjie;
import java.util.HashMap;
/**
* hashmap如果key是自己对象
* 一般需要覆盖hashcode和equal方法
*
* 最重要的是:
* 1. 对象放进去之后hashcode不能修改,否则找不出啦
* 2. 即使equals总是false,也能找到!
*
* 原因:因为先比较hashcode,然后比较地址==,最后才是equals
*
* @author https://xwjie.github.io/
*/
public class HashMapDemo {
public static void main(String[] args) {
// hashcode是int类型,是会重复的。
System.out.println("BC".hashCode());
System.out.println("Ab".hashCode());
User user = new User(1L);
// 如果map的key是自己定义的对象!
HashMap<User, String> map = new HashMap<>();
map.put(user, "放进去的数据");
System.out.println("值为:" + map.get(user));
// 如果id改了,导致hashcode改了,再也拿不出来了
// key还是那个对象,并没有改变
user.setId(2L);
System.out.println("值为:" + map.get(user));
// 所以hashcode要覆盖实现,和指定的关键信息绑定,而且这个字段不能改变
// 如User对象的id必须加final,否则就是有bug
}
}
结论
hashmap如果key是自己对象,一般需要覆盖hashcode和equal方法
最重要的是:
- 对象放进去之后hashcode不能修改,否则找不出啦
- 即使equals总是false,也能找到!
原因: 因为先比较hashcode,然后比较地址==,最后才是equals
-----code github -----https://github.com/xwjie/springwebflux-ask/tree/master/basic/src/io/github/xwjie
点击查看更多内容
2人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦