Object、String的hashCode()和equals()对比

一、概述

hashCode()处理流程如下图所示:将一块信息(或地址值或内容)经过算法处理转化成一个整数。可用于生成哈希码的信息可以是任意字节序列,字符,数字或它们的组合。设计一个哈希算法需要考虑输入数据的许多细节。

当需要在基于散列的集合(或容器)有效地存储、并检索数据时,哈希码会很有用。在将数据存储在容器中之前,我们计算其哈希码,然后将其存储在基于其哈希码的位置(也称为桶)。当要检索数据,其哈希码用于在容器中查找其位置,进行检索信息更快。值得注意的是,使用哈希码有效地检索数据是基于哈希码值在一个范围内的分布。如果生成的哈希码不一致分布时,数据检索效率可能不高。在最坏的情况下,数据的检索可能跟线性搜索存储在容器中的所有元素一样糟糕。如果你使用哈希函数,那么容器中的所有元素将存储在同一个存储桶中,这需要搜索所有元素。设计哈希函数使得它为我们提供均匀分布的哈希码对于实现高效而言至关重要,可用于基于散列的容器的快速数据查询。
Java中哈希码的用途是什么? Java使用哈希码的原因与上述相同:有效地从基于散列的集合中检索数据。如果你定义的类的对象未用作基于散列的键,例如,在HashSet,HashMap等集合中,我们也可以使用hashCode()求得对象的哈希码。

 

设计equals()和hashCode()一般需要一起重写,hashCode()采用对象的一些变量或内存地址设计哈希算法时,equals()也需要使用相同的变量或内存地址。

设计equals()需要遵循以下规则(对于三个非空对象x,y,z):

(1)反身性:x调用自身返回true

(2)对称性:x调用y 和 y调用x 返回结果都一样

(3)传递性:若x.equals(y)、y.equals(z)返回true,那么x.equals(z)返回true

(4)一致性:x调用y,无论调用多少次,返回结果都保持一致,除非x或y的信息有所改变

(5)与null的比较:任何类的非空对象与空引用的比较,始终返回false

(6)equals()与hashCode()的关系:

如果x.equals(y)返回true,则x.hashCode()和y.hashCode()返回值相同;

如果x和y的hashCode()返回值相同,则x和y不一定equal

 

二、查看源码

Object.java源码:

hashCode():

public native int hashCode();

equals()ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值