Java中hashCode的实现
从我们刚学Java就知道,要重写equal就要一起重写hashCode.但是你有了解过hashCode的实现吗?
什么是hashCode
hash是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。<摘自百度百科>
总结
- 能够将数据压缩
- 针对同一输入具有唯一输出
- 存在数据冲突
hashcode能干什么
根据以上特性,很显然我们可以用hash比较2个对象是否相等。这也是为什么Java重新equal就要重写hashCode的原因。
Java的实现
既然Java中所以的对象都继承自Object。那我们就看看Object的hashCode实现吧。
竟然是native方法,查看hash实现源码发现有以下实现方式。
- 随机数
- 基于内存地址生成
- 固定值:1,用来测试
- 自增
- 利用位移生成随机数
可以看到除了第三种,其余的算法都不具有一致性。那么当我们没有重新Object.hashCode()的时候,JVM是怎么处理生成的hashcode呢?
对象头
jvm 将这种方式生成的hashcode存到了Java对象头 里。
对象头只是存储Object.hashCode()方法生成的hash。如果我们重新的hashCode()方法便不需要存到对象头。