==和equals的区别

本文详细介绍了Java中`equals`和`==`的区别。`==`比较的是基本类型变量的值或引用类型变量的内存地址,而`equals`默认比较对象的地址,但可被重写以比较对象内容。`hashCode`用于哈希结构,如HashMap,当重写`equals`时通常也需要重写`hashCode`以保持一致性。未重写`hashCode`可能导致哈希冲突,导致集合中存储相同内容但不同对象的情况。
摘要由CSDN通过智能技术生成

1)对于==,比较的是值是否相等

如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,equals继承Object类,比较的是是否是同一个对象

注意:equals方法不能作用于基本数据类型的变量。
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容

Object中的hashCode:
它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置。

当equals方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规约定:值相同的对象必须有相同的hashCode。
object1.equals(object2)为true,hashCode也相同;
hashCode不同时,object1.equals(object2)为false;
hashCode相同时,object1.equals(object2)不一定为true;
当我们向一个Hash结构的集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则链到后面(如果是链地址法)。
先调用hashCode,唯一则存储,不唯一则再调用equals,结果相同则不再存储,结果不同则散列到其他位置。因为hashCode效率更高(仅为一个int值),比较起来更快。

HashMap#put源码
hash是key的hash值,当该hash对应的位置已有元素时会执行以下代码(hashCode相同)

如果equals返回结果相同,则值一定相同,不再存入。

如果重写equals不重写hashCode会怎样
两个值不同的对象的hashCode一定不一样,那么执行equals,结果为true,HashSet或HashMap的键会放入值相同的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值