Kha*_*han 0 java collections equals hashmap hashcode
正如我读过的那样,如果自定义对象需要成为地图的键,则需要覆盖 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);
}
Run Code Online (Sandbox Code Playgroud)
正确的输出:
3-> 1A
2-> 2 B
它是方法的属性之一equals:它是自反的。意思就是
x.equals(x) == true
Run Code Online (Sandbox Code Playgroud)
一个对象总是等于它自己。在这种情况下,您正在中继equals方法的默认实现。
map.put(s1,1);
map.put(s1,3);
Run Code Online (Sandbox Code Playgroud)
并且因为默认实现是自反的
s1.equals(s1) == true
Run Code Online (Sandbox Code Playgroud)
值1被替换为3
然而,如果你做这样的事情,结果会有所不同
map.put(new Student(1,"A"),3);
s1.equals(new Student(1,"A"));
Run Code Online (Sandbox Code Playgroud)
您将需要覆盖hashCode并equals使其正常工作。
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |