我试图检索HashMap中的另一个元素的值,重写equals和hashcode方法。当我为student1和student3提供相同的哈希码并且这两个对象相等时,为什么rollId返回null?理想情况下它应该返回给我3.下面是代码片段:
主类
public static void main(String[] args) {
Map<Student, Integer> studentMap = new HashMap<Student, Integer>();
Student student1 = new Student();
student1.setRollId(1);
Student student2 = new Student();
student2.setRollId(2);
studentMap.put(student1, 1);
studentMap.put(student2, 2);
for (Entry<Student, Integer> entry : studentMap.entrySet()) {
if (entry.getValue().equals(1)) {
student1.setRollId(3);
}
}
Student student3 = new Student();
student3.setRollId(3);
System.out.println("Student1 HashCode " + student1.hashCode()
+ " Student3 HashCode " + student3.hashCode());
System.out.println("Object Equal === > " + student1.equals(student3));
Integer rollId = studentMap.get(student3);
System.out.println("RollId is " + rollId);
}
学生班级
private Integer rollId;
public Integer getRollId() {
return rollId;
}
public void setRollId(Integer rollId) {
this.rollId = rollId;
}
@Override
public int hashCode() {
return rollId;
}
@Override
public boolean equals(Object obj) {
Student student = (Student)obj;
if(this.rollId.equals(student.getRollId()))
{
return true;
}
return false;
}
答案 0 :(得分:1)
在将哈希键放入地图后,您无法更改哈希键,并期望地图继续正常工作。如果要更改密钥,则必须删除该项,更改密钥并重新插入。
来自Java文档:
注意:如果将可变对象用作映射键,则必须非常小心。如果在对象是地图中的键的情况下以影响等于比较的方式更改对象的值,则不指定映射的行为。
答案 1 :(得分:1)
HashMap
最终将键值对存储在表中,并使用给定键的哈希码计算表中索引的映射值。
当你修改rollId
属性时,你也会修改密钥的哈希码,这反过来会导致在内部表中查找与map 最初<不同的索引。 / em>用于存储值。
例如,表最初可能已分配了一定容量16,并且两对条目存储在索引1和2(假设rollId
对象中设置Student
) 。将哈希键从1更改为3后,地图将进行搜索
索引3,不存储任何值。
答案 2 :(得分:0)
您的代码存在的问题是您没有向studentMap
添加任何值。另外,我不明白为什么你在RollId
使用Integer并为你的hashCode计算一个int。如果你确实需要更大范围的整数,那么32位hashcode
(正如你计算的)我可能会为不同的rollIds
生成一个副本。考虑更改为int /
试试这段代码:
StudentDriver Class
package com.example.student;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class StudentDriver {
private static Student student1, student2, student3;
public static void main(String[] args) {
Map<Student, Integer> studentMap = new HashMap<Student, Integer>();
student1 = new Student();
student2 = new Student();
student1.setRollId(1);
student2.setRollId(2);
studentMap.put(student1, student1.getRollId());
studentMap.put(student2, student2.getRollId());
for (Entry<Student, Integer> entry : studentMap.entrySet()) {
System.out.println("Entry information: " + entry.getValue());
if (entry.getValue().equals(1)) {
student1.setRollId(3);
}
}
student3 = new Student();
student3.setRollId(3);
System.out.println("Student1 Hashcode = " + student1.hashCode()
+", Student3 Hashcode = " + student3.hashCode()) ;
System.out.println("Object equal ==> " + student1.equals(student3));
Integer rollId = student3.getRollId();
System.out.println("RollId is " + rollId);
}
}
学生班
package com.example.student;
public class Student {
// Object fields
private Integer rollId;
public Integer getRollId() {
return rollId;
}
public Student setRollId(Integer rollId) {
this.rollId = rollId;
return this;
}
@Override
public int hashCode() {
return rollId.intValue();
}
@Override
public boolean equals(Object other) {
return other instanceof Student && ((Student)other).getRollId() == rollId;
}
}