史上最通俗易懂的hashCode()讲解

hashCode()在集合中有很大的用处,后面小编将会写关于集合的文章,欢迎喜欢的小伙伴订阅关注哦!好了,下面来看一下关于hashCodeO() 的具体内容吧。

public int hashCode():hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。且是int类型的散列码。对象的散列码是为了更好的支持基于哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet 等。

首先还是要看一下Object类中的hashCode()方法。毕竟Object是万类之父。

上面是中文版的API说的,其实在Object源码中,hashCode()方法是:public native int hashCode();native就是表明这个方法要借助其他语言写的方法来实现它的功能。这里就不多说了,不知道可以自行百度。

关于hashCode方法,一致的约定是:

1、重写了euqls方法的对象必须同时重写hashCode()方法。

2、如果2个对象通过equals调用后返回是true,那么这两个对象的hashCode方法也必须返回同样的int型散列码。

3、如果2个对象通过equals返回false,他们的hashCode返回的值允许相同。(然而,程序员必须意识到,hashCode返回独一无二的散列码,会让存储这个对象的hashtables更好地工作。

下面来看一下简单的输出hash码的demo:

这里先插一句equals的事情,作为回复上一篇的疑问,通过源码的分析我们知道:

(1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

(2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。

好了,下面再来看一下String类中的hashCode源码,此时的hashCode()方法已被重写。

/** The value is used for character storage. */

private final char value[];//保存字符串内容,因此String是不可变的。

来看一下官方API的解释:

下面再来看一下重写了hashCode()方法的类:Integer。

看一个简单的demo:

下面再次将equals和hashCode放在一起简单的做个总结:

(1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

(2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。

(3)默认。

==默认比较对象在JVM中的地址。

hashCode 默认返回对象在JVM中的存储地址。

equal比较对象,默认也是比较对象在JVM中的地址,同==

最后依然欢迎大家评论!小编会在第一时间回复,如果喜欢的话,欢迎订阅哦!一起交流学习进步,毕竟读者中编程大神大有人在啊!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值