hashcode会重复吗
hashcode会重复。因为hashCode只是计算一次,保存在对象头中,就算用内存地址相关策略,也会因为垃圾回收等导致不同对象的内存地址一样,从而引发hashcode重复冲突。因此,hashcode会重复。
hashcode的作用
hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址,那么对象如何得到hashcode呢?通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,所以,hashcode是什么呢?就是在hash表中对应的位置。这里如果还不是很清楚的话,举个例子,hash表中有 hashcode为1、hashcode为2、(…)3、4、5、6、7、8这样八个位置,有一个对象A,A的物理地址转换为一个整数17(这是假如),就通过直接取余算法,17%8=1,那么A的hashcode就为1,且A就在hash表中1的位置。
hashcode重复的原理
1.java中所有的对象都有一个父类Object,而Object类都有hashCode方法,也就是说java中所有的类均会有hashCode方法;
2.Object类的hashCode方法是native的,即是通用C语言来写的,本文举例使用的是String类,自己重写了hashCode方法,算法即如下:
String.hashCode()=str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + … + str.charAt(n-1)
3.String类的hashCode算法是固定的,根据算法就可以看到是可能会存在相同hashCode的;
4.两个String的hashCode相同并不代表着equals比较时会相等,它们两者之间是没有必然关系,这一点可以看看equals方法的实现。