java中的hashCode,==和equals

本文详细解释了Java中equals方法和hashCode方法的工作原理及其重要性。包括equals方法的五大特性要求,以及hashCode与equals之间的关系,强调了良好的hashCode设计对提高散列表效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在不重写equals的情况下,equals和==是相同的,都是比较两个内存地址是否相等。但是大家都知道String,Integer等的比较用equals可以,但是==不可以,那是因为在这些类中重写了equals方法。我们可以在Object类中可以看到这个:

public boolean equals(Object obj) {
    return (this == obj);
}

说明默认equals就是调用的==,所以如果在我们建立一个类的时候想让属性值完全相同的两个对象调用equals返回true(比如Person p1和Person p2的所有属性值包括姓名年龄工号等都相同,那么这两个为同一个人),那么就要重写equals方法,根据你自己对相等的定义重新写。

2.怎样重写equals方法

①自反性:对于任何非空引用x,x.equals(x)应该返回true。
②对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
③传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
④一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
⑤非空性:对于任意非空引用x,x.equals(null)应该返回false。

2.hashCode是什么

hashCode只在散列表中使用。例如HashSet中,要求对象不能重复,则添加新对象时要跟每个已有对象进行对比,如果hashCode不同则视为不同对象,如果相同再比较equals,如果也相同则视为相等的两个对象,否则(此时即为哈希冲突)视为不同对象,插入HashSet。故hashCode设计的好可以提高散列表的效率。

3.hashCode和equals的关系

①equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

②hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

如有疏漏或是不正确的地方欢迎大家指正。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值