Java中的“==”与equals()


前言

本博客主要介绍一下java中双等号“==”与equals()方法的不同


一、==

==可以用来测试引用的相等性,也就是说如果两个比较对象指向相同的内存存储,那么这两个对象就满足引用相等性。

对基本数据类型可以用==来判相等

在我们面向对象编程的时候还是尽量不要用==号,在比较两个对象的时候用双等号是一个不好的习惯。我们应该尽量选择重写Object类中的equals方法。

二、equals()

1.equals()方法用来测试对象等价性

在我们编写一个新的对象的时候,我们有责任确定对象相等时候表示数据类型的值,并且重写equals()方法。

2.完成equals()方法

equals()方法是被object这个类定义的,它的原始定义是这样的:

这其实是在判断引用等价性,这通常不是我们所期望的,因此我们在设计类的时候都需要重写equals()方法。

ps.注意,这里是重写equals()方法不是重载,如果你重载了equals()方法有可能最后用的仍然是object所提供的原始的equals()方法。

用equals()方法判断两个对象是否等价,那么这两个对象要满足等价关系的性质:自反、对称、传递。

除非对象被修改了,否则多次调用equals()的结果应该是相同的(注意,相等的对象其hashCode()结果也应该是相同的)

这里需要注意的是传递性的陷阱:,下图是Duration类的equals()方法和它用到的sameValue()方法。 

当我们构造了4个对象,我们按下面的方式调用equals()方法,可以得到全都是等价的

Duration d_0_60 = new Duration(0, 60);
Duration d_1_00 = new Duration(1, 0);
Duration d_0_57 = new Duration(0, 57);
Duration d_1_03 = new Duration(1, 3);
d_0_60.equals(d_1_00);
d_1_00.equals(d_0_60);
d_1_00.equals(d_1_00);
d_0_57.equals(d_1_00);
d_0_57.equals(d_1_03);
d_0_60.equals(d_1_03);

 因为两个类等价具有传递性,所以d_0_57与d_1_03也等价,可从equals()方法中我们看到这两个对象是不等价的,这就是没有考虑到传递性的equals()方法设计。

说了半天其实还没有说具体要怎么去写equals()方法,那么下面是一些通用的方法:

1.关于Immutable类型的类,可以用AF去判相等,如果AF能够映射到相同的结果,那么这两个类就等价。你也可以从外部观察者的角度去判定,对两个对象调用任何相同的操作都会得到相同的结果,那么这两个类就等价(注意不能脱离RI和AF)

2.关于mutable类型的类判相等,可以从观察等价性的角度,即某一个时间点这两个mutable对象是否看起来一致,或者从行为等价性,即在运行的任何时候都相等,调用对象任何一个方法都展示出一致的结果,那么这两个对象就相等。


总结

以上简单叙述了一下equals()方法和双等号的区别以及equals()方法的编写思路。当然如果你的集合中有hashset,你还要去重写hashCode()方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值