通过源码可知,HashMap会调用key的hashCode()和equals()方法,来进行存储、查找与比较。
这是Object的equals方法,是比较的地址。
public boolean equals(Object obj) {
return (this == obj);
}
至于Object的hashCode(),是native方法,就是java调用非java代码的接口,一般是由C/C++语言实现并被编译成了DLL文件,其实现就在这些DLL文件中。
OpenJDK8 默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数。和对象内存地址无关。
总而言之,如果不重写对象的hashCode() equals(),那基本上放进hashMap就拿不到了;另外,因为put时当hashcode相同会再次调用equals()选择是覆盖还是添加,因为比较的是地址且都不同,就不会覆盖而是添加,如果一直put,迟早会发生内存溢出。
版权声明:本文为Nothing_can_do原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。