Java 重写hashcode()方法后出现奇怪的结果
我有以下情况-Java 重写hashcode()方法后出现奇怪的结果,java,hashmap,Java,Hashmap,我有以下情况- 我正在使用泛型创建一个HashMap。键的类型为TestHashMap,值的类型为String 在TestHashMap的主要方法中,我使用TestHashMap的三个实例作为键来存储三个不同的字符串 我重写hashcode()方法,以便它在每次调用时返回不同的整数 然后我提取HashMap中的键并打印出相应的值 这给了我完全出乎意料的结果-我得到了三个键值对中每个值的null 请注意,如果我没有在hashcode()的不同调用上返回不同的整数,而是返回相同的整数,那么一切正常
import java.util.HashMap;
import java.util.Set;
public class TestHashMap {
private static int hash = 0;
public static void main(String[] args) {
HashMap<TestHashMap,String> h = new HashMap<TestHashMap,String>();
TestHashMap thm1 = new TestHashMap();
TestHashMap thm2 = new TestHashMap();
TestHashMap thm3 = new TestHashMap();
h.put(thm1, "one");
h.put(thm2, "two");
h.put(thm3, "three");
Set<TestHashMap> keys = h.keySet();
for(TestHashMap k : keys){
System.out.println(k + " " + h.get(k));
}
}
@Override
public int hashCode(){ return hash++;}
}
import java.util.HashMap;
导入java.util.Set;
公共类TestHashMap{
私有静态int散列=0;
公共静态void main(字符串[]args){
HashMap h=新的HashMap();
TestHashMap thm1=新的TestHashMap();
TestHashMap thm2=新的TestHashMap();
TestHashMap thm3=新的TestHashMap();
h、 put(thm1,“一”);
h、 put(thm2,“两”);
h、 put(thm3,“三”);
设置键=h.键集();
for(TestHashMap k:keys){
System.out.println(k+“”+h.get(k));
}
}
@凌驾
public int hashCode(){return hash++;}
}
- 当您将一个对象放入映射时,映射将读取密钥的哈希代码并将其放入相应的bucket中
- 当您稍后通过同一个键获得一个对象时,map将再次读取该键的hashcode,并在该bucket中查找与该键相等的对象
- 但是您的密钥每次都为映射提供不同的哈希代码。所以可怜的地图被骗到了错误的地方
- 当您将一个对象放入映射时,映射将读取密钥的哈希代码并将其放入相应的bucket中
- 当您稍后通过同一个键获得一个对象时,map将再次读取该键的hashcode,并在该bucket中查找与该键相等的对象
- 但是您的密钥每次都为映射提供不同的哈希代码。所以可怜的地图被骗到了错误的地方
等于。。。您的hashCode()
方法不稳定。(如果您调用它两次,它将永远不会返回相同的值…)我建议您修改hashCode()
和equals
的要求。为什么它们会产生完全出乎意料的结果?hashCode
的作用是什么?HashMap
是如何使用它的?谢谢大家。正如我在回复@William时所说,我应该考虑检索而不仅仅是存储。您没有覆盖equals
。。。您的hashCode()
方法不稳定。(如果您调用它两次,它将永远不会返回相同的值…)我建议您修改hashCode()
和equals
的要求。为什么它们会产生完全出乎意料的结果?hashCode
的作用是什么?HashMap
是如何使用它的?谢谢大家。正如我在回复@William时所说的,我应该想到检索,而不仅仅是存储。啊,当然了!你真聪明,马上就发现了问题。谢谢顺便说一句,我真是太愚蠢了,竟然没有想到检索。@user3516726,其实并不那么聪明,因为每个有经验的Java程序员都知道,每当a.equals(b)
你必须确保a.hashcode()==b.hashcode()
。啊,当然!你真聪明,马上就发现了问题。谢谢顺便说一句,我真是太愚蠢了,竟然没有想到检索。@user3516726,其实并不那么聪明,因为每个有经验的Java程序员都知道,每当a.equals(b)
你必须确保a.hashcode()==b.hashcode()
。