== 和 equals 的区别

java中常用== 和 equals 来对两个对象进行比较,下面我们来探讨下两者的区别:

  • equals 一个是方法,而 == 是运算符。

  • == 如果比较的是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。

  • equals() 用来比较两个对象的内容是否相等。

如果没有对 equals 方法进行重写,默认比较的是引用类型的变量所指向的对象的地址,像我们常用的String,Long,ArrayList等对象已经进行了重写,所以可以拿来直接使用,但我们的自定义对象则需要我们自己重写equals方法。在重写 equals时必须重写 hashCode 方法,这又是为什么呢?

这可以说是java中默认的一个惯例,为什么会这样呢?

首先我们来了解一下hashCode(),hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列主要就是为了可以快速找到所需要的对象。

在java底层的集合框架中,如HashSet(不允许元素重复),为了提高查询的效率,在确定某个对象的存储位置时,往往需要通过调用对象的hashCode方法来实现。当需要把一个对象放进去时,会先调用这个对象的hashCode方法,并对返回的结果进行处理,最终得出该对象在HashSet中的具体位置。没有重写hashCode方法,所以即使equals判断为true,但是他们保存的位置在底层数组上时不一样的,不会触发HashSet的去重功能,从而导致两个相同的对象却会在HashSet中出现多次,这就与它本身不允许重复相违背。

因此我们需要同时重写hashCode(),这样一来,如果两个对象有相同 hashcode 值,才会调用 equals()方法来检查 ,如果不同,则两个对象不相等,就大大减少了 调用equals 的次数,相应大大提高了执行速度。

由此也就有了hashCode()与 equals()的常规协定:

  1. 如果两个对象相等,则 hashcode 一定也是相同的;

  2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true;

  3. 两个对象有相同的 hashcode 值,它们也不一定是相等的;

  4. equals  方法被覆盖过,则 hashCode  方法也必须被覆盖。

注:需要留意的是基本类型的包装类型,缓存范围内的可以直接使用==比较值是否相等,之外的只能使用equals比较值是否相等,如new Integer(120) == new Integer(120)(Integer:-128~127)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值