Java 为什么hashcode调用两次? 公共A类{ @凌驾 公共int hashCode(){ System.out.println(“hashcode”); 返回1; } 公共静态无效主(字符串…s){ HashMap hm=新的HashMap(); A1=新的A(); A A2=A1; A3=新的A(); hm.put(A2,“sometext”); hm.put(A3,“sometext2”); 系统输出打印项次(hm); } }

Java 为什么hashcode调用两次? 公共A类{ @凌驾 公共int hashCode(){ System.out.println(“hashcode”); 返回1; } 公共静态无效主(字符串…s){ HashMap hm=新的HashMap(); A1=新的A(); A A2=A1; A3=新的A(); hm.put(A2,“sometext”); hm.put(A3,“sometext2”); 系统输出打印项次(hm); } },java,Java,当运行上述代码“hascode”打印两次时,请任何人解释原因 输出: 哈希码 哈希码 哈希码 哈希码 {com.svdo.td3e.launcher.dao。A@1=sometext2,com.svdo.td3e.launcher.dao。A@1=sometext}在代码中,根本不会调用hashcode,因为它不会覆盖hashcode(大写c) 如果您更正方法的名称,它将被调用未定义的次数,这取决于HashMap实现的详细信息。在我的例子中,JDK 8只调用一次 如果您想了解为什么在您的情况下会

当运行上述代码“hascode”打印两次时,请任何人解释原因

输出: 哈希码 哈希码 哈希码 哈希码
{com.svdo.td3e.launcher.dao。A@1=sometext2,com.svdo.td3e.launcher.dao。A@1=sometext}

在代码中,根本不会调用
hashcode
,因为它不会覆盖
hashcode
(大写
c

如果您更正方法的名称,它将被调用未定义的次数,这取决于
HashMap
实现的详细信息。在我的例子中,JDK 8只调用一次


如果您想了解为什么在您的情况下会两次调用它,我建议使用调试器并进入
put
方法查看发生了什么。

上述代码不会打印任何内容,因为您没有在代码中调用自定义的“hashcode()”方法。不要假设您正在重写Object hashCode()方法。请检查对象类中可用的方法名称

我知道了,由于toString方法,另外一个“hashcode”正在打印。

您在
hashcode()
方法名称中有一个输入错误。它必须是
hashCode()
,否则它不会覆盖
对象#hashCode()
方法。还对第二个
HashMap
给出了警告:
新表达式中的冗余类型参数(改用菱形运算符)
这是什么版本的Java?测试并查看JavaSE6,注意只在put中调用一次
hashCode()
。它还将哈希代码存储在映射项中,以便在解决表冲突时不会调用。
 public class A {

@Override
        public int hashCode(){
        System.out.println("hashcode");
        return 1;
        }
        public static void main(String... s){
        HashMap<A,String> hm = new HashMap<A,String>();
        A A1 = new A();
        A A2 = A1;
        A A3 =new A();
        hm.put(A2,"sometext");
        hm.put(A3,"sometext2");
        System.out.println(hm);
        }



}