java - 自定义对象作为 Map 键
问题描述
正如我所读到的,如果自定义对象需要成为 map 的键,则需要覆盖 hashcode 和 equals 方法,但在我的情况下,它可以在不覆盖它的情况下工作。有人可以告诉我出了什么问题吗?
Map<Student,Integer> map = new HashMap<>();
Student s1=new Student(1,"A");
Student s2=new Student(2,"B");
Student s3=new Student(3,"C");
map.put(s1,1);
map.put(s2,2);
map.put(s1,3);
for(Student s:map.keySet()) {
System.out.println(map.get(s) + "->" + s.id + " " +s.name);
}
正确的输出:
3-> 1 安
2-> 2 B
解决方案
它是方法的属性之一equals
:它是自反的。意思就是
x.equals(x) == true
一个对象总是等于它自己。在这种情况下,您正在中继方法的默认实现equals
。
map.put(s1,1);
map.put(s1,3);
并且因为默认实现是自反的
s1.equals(s1) == true
值1
被替换为3
但是,如果您这样做,结果会有所不同
map.put(new Student(1,"A"),3);
s1.equals(new Student(1,"A"));
您将需要覆盖hashCode
并equals
使其正常工作。
推荐阅读
- node.js - nodejs npm install sqlite3 等数据库打包报错
- excel - 根据标题名称选择范围
- java - org.bouncycastle.tls.crypto.TlsCertificate getSubject() 和其他 getter
- php - 如何根据完全匹配或部分匹配从数组中输出项目?
- symfony - Symfony 中的翻译覆盖在本地主机上不起作用
- python-3.x - Pandas 系列 value_counts 出现意外结果
- python - netmiko 脚本连接路由器
- postgresql - pg-go RunInTransaction 不回滚事务
- android - Google Speech to Text 不返回结果
- css - 材料 11 - 应用 mat-sort-header 时无法右对齐 5 列中的 2 列 mat-header-cell