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); } }
当运行上述代码“hascode”打印两次时,请任何人解释原因 输出: 哈希码 哈希码 哈希码 哈希码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只调用一次 如果您想了解为什么在您的情况下会
{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);
}
}