hashcode的作用_JAVA类的hashCode

cf12098707cb66cf25be554ef3400ede.png

一、什么是hashCode?

hashCode是通过一种hash算法计算,并返回int类型的值,典型的hash算法:

1、Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

2、String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。

3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

(摘自“百度百科”)

二、hashCode的作用?

Java中类的hashCode是使用在类似哈希表的数据结构中的,如HashMap、HashSet、HashTable等,用于定位元素的位置,在其它地方没有什么意义!

三、为什么要重写hashCode()?

Java中,Object是所有类的祖先,所以我们来看下Object中的hashCode(),源码如下:

/**

可见,hashCode()方法是native方法,其返回值是int;既然是native方法,那么查看hashCode的jvm源码,从中分析,不难得出有以下几种实现:

  1. 随机数
  2. 基于内存地址生成
  3. 固定值:1,用来测试
  4. 自增
  5. 利用位移生成随机数

jvm中生成hashCode源码:

b46efa0284067011739329a78d457512.png

可以看到除了第三种,其余的算法都不具有一致性。那么当我们没有重写Object.hashCode()的时候,JVM是怎么存储生成的hashcode呢?弄清楚这个问题之前,我们先要了解jvm中的对象头。

四、对象头

jvm 将这种方式生成的hashcode存到了Java对象头里,对象头只是存储Object.hashCode()方法生成的hashCode。如果我们重写hashCode()方法便不需要存到对象头,就是说,如果你不重写hashCode()方法,那么jvm给我们提供了一种默认的生成hashCode的方法,生成的hashCode就存储在了对象头里。

http://weixin.qq.com/r/5Tmiug-EZVIarUvZ92z3 (二维码自动识别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值