android equals == 区别,equals 与 == 操作符

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png)

[TOC]

## 1、一些概念:

1. 若 `==` 两侧都是基本数据类型,则判断的是左右两边操作数据的值是否相等

2. 若 `== `两侧都是引用数据类型,则判断的是左右两边操作数的内存地址是否相同。若此时返回 `true` , 则该操作符作用的一定是同一个对象。

3. `Object` 基类的 `equals` 默认比较两个对象的内存地址,在构建的对象没有重写 `equals` 方法的时候,与 `==` 操作符比较的结果相同。

4. `equals` 用于比较**引用数据类型**是否相等。在满足`equals` 判断规则的前体系,两个对象只要规定的属性相同我们就认为两个对象是相同的,比如 String 就重写了 equals 方法,所以可以用 equals 去实现比较字符串是否相等

![](https://img.kancloud.cn/6e/62/6e62dc790330a36c571f5799cf448e41_1314x736.png)

## 2、hashCode 方法返回的是对象的内存地址么?

`Object` 基类的 `hashCode` 方法默认返回对象的内存地址,但是在一些场景下我们需要覆写 `hashCode` 函数,比如需要使用 `Map` 来存放对象的时候,覆写后 `hashCode` 就不是对象的内存地址了。

在 String 类中,就提供了重写的 hashCode 方法,如下:

```java

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];

}

hash = h;

}

return h;

}

```

可以看到,在 String 类的 hashCode 方法中,会针对当前的 String 字符串计算出唯一的 hash 值。

## 3、为什么一般重写equals 方法 也会重写 hashcode 方法

因为在使用 hashmap 的时候,会先根据 key 值得 hashCode 方法计算出 hash 值,确定该元素在数组中的位置,如果数组中不存在该值,那么就直接把元素的 key 放进数组,代表了元素的插入。

如果数组中存在该 key 的 hashCode ,那么就会遍历链表,遍历链表的时候使用的是元素 key 值的 equals 方法去判断是否相等的,

如果相等用新的 value 取代旧的 value

那么问题来了?

如果不重写 hashCode 方法,那么就无法定位到一个位置,两个通过 equals 方法相等的key,我们认为是同一个key,但是由于hashCode 没有定位到同一个位置,会导致插入重复元素,重写 equasl 就没有什么意思了。

就会出现如图的问题:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190526230158.png)

如果重写了hashcode方法,确保两个对象在定位的时候,都能够定位到相同的位置,那么就可以遍历这条单向链表,使用equals方法判断两个对象是否相同,如果相同,那么就不插入了(HashMap的实现仍然插入,但是覆盖掉旧的value)。如果不相同,就插入到链表的头节点处。

## 4、重写 equals 方法有什么官方规范

1. 自反性:x.equals(x) = true;

2. 对称性:如果有x.equals(y) = true,那么一定有y.equals(x) = true;

3. 传递性:对任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那么一定有x.equals(z)= true;

4. 一致性:无论多少次调用,x.equals(y)总会返回相同的结果。

5. 非空性(暂定):所有的对象都必须!=null;

步骤:

1. 使用==操作符检查“实参是否为指向对象的一个引用”,如果是则返回true;

2. 使用instanceof操作符检查“实参是否为正确的类型”,如果不是,则返回false;

3. 将传递进来的参装换为正确的要比对的类型;

4. 对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域是否匹配。如果所有测试都成功,则返回true,否则返回false。(**参考 String,是比对没个 char 的值是否相等的**)

5. 方法完成之后,确定 equals 方法的对称性,传递性,一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值