首先这个一个很无聊的问题,因为真正大家在用HashMap的时候,一般都是用简单类型的封装类,比如Integer, Long或者String不可修改的对象来作为key,所以不会遇到这篇博客讨论的问题。
先看这样一段代码:
public class MyObject {
private int value = 0;
public MyObject(int value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public int hashCode() {
return value;
//return super.hashCode();
}
}
MyObject是一个自定义类。它修改了hashCode方法,Object中的hashCode是一个native方法,返回了对象在虚拟机中的地址(也不全是地址),子类的实现各有不同,String类的实现如下,和内容完全相关。
public int hashCode() {
int h = hash;
if (h == 0) {