hashcode

hashcode和内存地址的关系

两者本身在JDK默认的情况下没有关系。
hashcode是为了快速找到此对象的一个标识。
内存地址是对象在堆空间中的位置。
但是可以修改JDK默认的配置使hashcode等于内存地址(但是没必要)

hashcode生成方案

在JDK的cpp文件中存在一个get_next_hash()函数用于生成Java中所有对象的hashCode值
伪代码如下:
if(hashcode==0){
    value = os::random();
}else if(hashcode==1){} else if(2){value = 1;}...
注意:此代码中一共存在6中生成策略。默认的策略为5;但是默认值是可以修改的。修改位置根据不同的IDE位置不同。以IDEA为例在安装包的bin目录下的idea64.exe.vmoptions文件。

修改hashCode生成策略配置如下:
-XX:hashCode=N   N的取值范围0-5

hashcoee的5中策略

第0种策略:
此种策略底层使用的是Park-Miller RNG随机生成策略。但是在实际开发中不推荐使用。因为这种随机算法在高并发的时候存在自旋等待问题。

第1种策略:
把此对象的内存地址赋值给hashcode

第2种策略:
if(hashcode==2){
    value=1;
}
整个程序中所有对象的hashcode都是1

第3种策略:
if(hashcode==3){
    value=++ xxx;
}
整个程序中所有对象的hashcode都是从1开始,逐步自增

第4种策略:
把此对象的内存地址赋值给hashcode。和策略1功能一样,只是底层使用的算法不同

第5种策略(默认情况):
根据当前状态值进行XOR(异或)运算得到一个hashcod。此种算法相比较前几种算法效率高很多。但是会存在重复率问题。但是重复无所谓,因为JVM本身就没想着保证hashcode唯一性。因为JDK官方描述中hashcode的作用就是为了快速查询所用。所以重复问题不在考虑范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值