JAVA中== equals hashCode

本文探讨了Java中equals和==的区别,基本数据类型比较值,引用类型比较内存地址。同时,解释了equals与hashCode的关系,强调在重写equals时通常需重写hashCode。hashCode用于散列表的定位,两个equals相等的对象应有相同的hashCode。不重写可能导致HashSet和HashMap的行为异常。
摘要由CSDN通过智能技术生成

前言

最近老婆大人在学习编程,what?一个金融专业的都来学编程了!!!看来程序猿们的内卷不只来自于同行, 其他行业也开始对咱们施压了。问我的一些Java的基础知识,有些我竟然答不上来,所以最近准备再撸一遍基础知识。
在这里插入图片描述

equals和==的区别

对于基本数据类型(byte,short,char,int,long,float,double,boolean), ==比较的是值相等

对于引用类型,在没有覆写equals方法的情况下,==比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
But, JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

equals方法和hashcode的关系?

同为Object类中的方法

public boolean equals(Object obj)
public native int hashCode()

需要注意以下三点:
1、两个对象equals不相等,那么两对象的hashCode()返回必定不同(此处可用来提高哈希表性能)
2、两个对象的hashCode()返回值相同,两对象不一定相同,还需要通过equals()再次判断
3、当equals方法被重写时,通常有必要重写 hashCode 方法
hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置,当对象不会用来创建像hashMap、hashSet等散列表时,hashCode()实际上用不上。

重写equals方法后重写hashCode方法的必要性

Set区别对象是不是唯一的标准是,两个对象hashcode是不是一样,再判定两个对象是否equals;
Map 是先根据Key值的hashcode分配和获取对象保存数组下标的,然后再根据equals区分唯一值(详见下面的map分析)

如果两个对象互相equals,那么这两个对象的hashcode值必须相等;

举个例子,比如:有个A类重写了equals方法,但是没有重写hashCode方法,看输出结果,对象a1和对象a2使用equals方法相等,按照上面的hashcode的用法,那么他们两个的hashcode肯定相等,但是这里由于没重写hashcode方法,他们两个hashcode并不一样,所以,我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。
         在这里插入图片描述

参考:

https://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
https://www.oschina.net/question/82993_75533
https://zhuanlan.zhihu.com/p/30321358

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值