一、什么是Hash
想要了解hashcode,首先要知道什么是hash,下面是百度对hash的解释:
摘要:Hash是一个把任意长度的输入通过散列算法转换成固定长度的输出的函数。不同的输入可能会散列成相同的输出。也就是说,hash值不一定唯一。
二、什么是hashTable
三、什么是hashcode
提到hashcode,通常我们会理解为对象的地址,这里存在一个误区,对象的物理地址跟这个hashcode地址不一样,hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址。
那么对象的hashcode如何获得?String类型使用如下算法计算hashcode:
int hash = 0;
for(int i=0;i<length();i++){
hash = 31*hash+charAt(i);
}
由于hashCode()方法定义在Object类中,因此每个对象都有一个默认的hashcode,其值有对象的物理存储地址得出。
四、hashCode()与equals()
通常情况下,equals()方法应与hashCode()方法返回值相同,因此如果重新定义了equals()方法,就必须为用户可能插入hash表的对象重新定义hashCode()方法。
五、hashCode的存储位置
这里图有一些纰漏,其中markword和class pointer部分组合成为对象头。
其中markword占8字节,class pointer在压缩后占4字节(未压缩的情况下占8字节)。实例数据见其他数据结构在内存中所占大小。对齐位是为了使整个对象大小为8字节的倍数。
image.png
hashcode就存储在对象头的markword部分,同时,只有在对hashCode()方法进行了调用之后,才会将值存入其中。