Java Object.hashCode()源码分析
文章目录
- hashcode介绍
- hashCode源码分析
- 参考
hashcode介绍
- hashcode是Object中的函数,所有类都拥有的一个函数,主要返回每个对象的hash值,主要用于哈希表中,如HashMap、HashTable、HashSet。
哈希码的通用约定如下:
- 在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
- 如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。
- 如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。
由下图可以看到,hashCode是一个native方法,看不到实现,注解中说hashCode返回的是由对象存储地址转化得到的值,是否如此,可以看源码一探究竟。

hashCode源码分析
先给结论:
- java6、7默认是返回随机数
- java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数
源码探索过程可以参考:
https://fangjian0423.github.io/2016/03/12/java-Object-method/
static inline intptr_t get_next_hash(Thread * Self, oop obj) {intptr_t value = 0 ;if (hashCode == 0) {// 根据Park-Miller伪随机数生成器生成的随机数value = os::random() ;} elseif (hashCode == 1) {// 此类方案将对象的内存地址,做移位运算后与一个随机数进行异或得到结果intptr_t addrBits = cast_from_oop(obj) >> 3 ;value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;} elseif (hashCode == 2) {value = 1 ; // 返回固定的1
} elseif (hashCode == 3) {value = ++GVars.hcSequence ; // 返回一个自增序列的当前值} elseif (hashCode == 4) {value = cast_from_oop(obj) ; // 对象地址} else {// 通过和当前线程有关的一个随机数+三个确定值unsigned t = Self->_hashStateX ;t ^= (t << 11) ;Self->_hashStateX = Self->_hashStateY ;Self->_hashStateY = Self->_hashStateZ ;Self->_hashStateZ = Self->_hashStateW ;unsigned v = Self->_hashStateW ;v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;Self->_hashStateW = v ;value = v ;}value &= markOopDesc::hash_mask;if (value == 0) value = 0xBAD ;assert (value != markOopDesc::no_hash, "invariant") ;TEVENT (hashCode: GENERATE) ;return value;
}
参考
https://juejin.im/entry/5968876df265da6c232898c2
https://fangjian0423.github.io/2016/03/12/java-Object-method/
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
