根据我所了解的,要将一个对象用作hashMap的键,它必须提供正确的重写和实现equals和hashCode方法。HashMap的get(Key k)方法调用key对象的hashCode方法,并将返回的哈希值应用于其自身的静态哈希函数,以查找存储键和值的桶位置(支持数组),以嵌套类Entry(Map.Entry)的形式存储。HashMap内部的哈希方法可以防止质量较差的哈希函数。
为了测试这些协议,我编写了一个bean类,其中包含不正确但合法的equals和hashCode方法实现。
该类:
在这种情况下,HashMap的哈希方法,
这个方法每次都应该返回相同的值,因为哈希码总是返回31。因此,如果将HashVO类对象用作hashMap的键,get方法将不起作用,因为它应该去同一个桶中检索对象,而equals方法总是返回false,所以它无法找到与键对象匹配的对象。
但是当我使用这个方法时,
输出结果是正确的,且已经显示。
我想了解为什么即使Equals和HashCode方法的实现不正确,也会出现正确的输出结果。
为了测试这些协议,我编写了一个bean类,其中包含不正确但合法的equals和hashCode方法实现。
该类:
public class HashVO {
private String studentName;
private int age;
private boolean isAdult;
public HashVO(String studentName, int age, boolean isAdult) {
super();
this.studentName = studentName;
this.age = age;
this.isAdult = isAdult;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isAdult() {
return isAdult;
}
public void setAdult(boolean isAdult) {
this.isAdult = isAdult;
}
@Override
public String toString() {
return studentName + " : " + age + " : " + isAdult;
}
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return 31;
}
}
在这种情况下,HashMap的哈希方法,
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
这个方法每次都应该返回相同的值,因为哈希码总是返回31。因此,如果将HashVO类对象用作hashMap的键,get方法将不起作用,因为它应该去同一个桶中检索对象,而equals方法总是返回false,所以它无法找到与键对象匹配的对象。
但是当我使用这个方法时,
public static void main(String[] args) {
HashMap<HashVO, String> voMap = new HashMap<HashVO, String>();
HashVO vo = new HashVO("Item1", 25, true);
HashVO vo1 = new HashVO("Item2", 12, false);
HashVO vo2 = new HashVO("Item3", 1, false);
voMap.put(vo, "Item");
voMap.put(vo1, "Item1");
voMap.put(vo2, "Item2");
System.out.println(voMap.get(vo));
System.out.println(voMap.get(vo1));
System.out.println(voMap.get(vo2));
}
输出结果是正确的,且已经显示。
Item
Item1
Item2
我想了解为什么即使Equals和HashCode方法的实现不正确,也会出现正确的输出结果。