为什么Java不执行用户定义类中重写的hashCode()方法?

3
即使您进行了覆盖,在将对象放入哈希映射作为键之前计算哈希时,它仍然会引用Object类中的hashcode方法并给出一些int值。
我已经覆盖了一个方法,该方法将为所有对象返回相同的值以测试hashcode,但每次它都从Object类的hashcode方法中获取值,该方法是用本地语言实现的。
如果它没有执行用户定义类中覆盖的hashcode方法,那么实现hashcode的目的是什么?
public class Product { 
    public String name ; 
    public int id;
    public int hashcode(){ int result = 1; return result; } 
}

理想情况下,所有产品对象的哈希码都应为1,但我得到的是像952115109540724846...这样的数字。为什么会这样?

3
你是否在你的子类中添加了 hashCode() 或者 hashcode() 方法? - Andreas Fester
2
@Narahari Babu Kannemadu 别再嘈杂了,快放些代码。 - Ankur Singhal
公共类产品 { public String name ; public int id; public int hashcode(){ int result = 1; return result; } } 这是我的类。对于所有类型为Product的对象,它始终返回1。理想情况下,当您计算哈希码时应该为1,但我得到了952115109,为什么? - Narahari Babu Kannemadugu
HashMap的实现会调用Key对象的hashCode方法,并将返回的哈希码应用到自己的哈希函数中,以找到一个桶位置。请参见http://javarevisited.blogspot.ch/2011/02/how-hashmap-works-in-java.html。 - hotzst
它不会运行自己的哈希函数(除了某些原因下的字符串)。 - Michael Lloyd Lee mlk
显示剩余3条评论
3个回答

6
public int hashcode(){ ... } 

必须是

public int hashCode(){ ... } 

请注意,在Java中,标识符是区分大小写的。
为避免此类错误,请使用@Override注释:
@Override
public int hashcode(){
    ...
}

如果超类中没有hashcode()方法,则会产生编译时错误。


2

hashCode 不是 hashcode,在Java方法中大小写敏感。

我建议您使用@Override,这样您的IDE会在您有类似的拼写错误时提醒您。


明白了,谢谢 :) - Narahari Babu Kannemadugu
请将答案标记为正确。 - Michael Lloyd Lee mlk

1
你把 hashcode() 中的所有字母都写成了小写,但实际上应该是 hashCode()
Java 中的变量和方法是区分大小写的。
public int hashCode()

这个方法是在Object类中声明的。

你并没有真正地重写Object类中的hashCode()方法。相反,你添加了一个新的hashcode()方法而不是覆盖原有的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接