Object.hashCode()打印的是对象的内存地址,但是经过重写之后可能返回的就有可能不是原来的内存地址值
// String 类重写了hashCode方法,内容一样返回的hash值就一样
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
// 通过hash * 31 + val[i]
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
例子:
public static void main(String[] args) {
String s = "sss";
String s2 = new String("sss");
System.out.println(s == s2);
System.out.println(s.hashCode());
System.out.println(s2.hashCode());
System.out.println(System.identityHashCode(s));
System.out.println(System.identityHashCode(s2));
HashMap hashMap = new HashMap();
hashMap.put(s,"sss");
hashMap.put(s2,"sss");
System.out.println(hashMap);
/*
false
114195
114195
1476011703
1603195447
{sss=sss}
*/
}
分析:
- 因为内存地址不一样,所以==比较之后返回false
- 因为String重写了hashCode(),所以返回的hash值一样
- hashmap为什么只存了一个值而已,因为它内部调用自己重写之后的hashCode()
解决:
//确保返回的不加修改的内存地址
System.identityHashCode(Object)