Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写hashcode()方法后出现奇怪的结果_Java_Hashmap - Fatal编程技术网

Java 重写hashcode()方法后出现奇怪的结果

Java 重写hashcode()方法后出现奇怪的结果,java,hashmap,Java,Hashmap,我有以下情况- 我正在使用泛型创建一个HashMap。键的类型为TestHashMap,值的类型为String 在TestHashMap的主要方法中,我使用TestHashMap的三个实例作为键来存储三个不同的字符串 我重写hashcode()方法,以便它在每次调用时返回不同的整数 然后我提取HashMap中的键并打印出相应的值 这给了我完全出乎意料的结果-我得到了三个键值对中每个值的null 请注意,如果我没有在hashcode()的不同调用上返回不同的整数,而是返回相同的整数,那么一切正常

我有以下情况-

  • 我正在使用泛型创建一个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()