为了账号安全,请及时绑定邮箱和手机立即绑定

当我们有==运算符时为什么是equals()方法?

当我们有==运算符时为什么是equals()方法?

翻阅古今 2019-08-28 14:12:15
当我们有==运算符时为什么是equals()方法?当我看到equals()方法的实现时,它什么也没做,只是做了什么==。所以我的问题是,当我们有==运营商做同样的工作时,需要将它作为单独的方法吗?
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

您不能重载==运算符,但equals(Object)如果您希望它与==运算符的行为不同,则可以覆盖,即不比较引用但实际比较对象(例如,使用其全部或部分字段)。

此外,如果你覆盖equals(Object),也看看hashCode()。这两个方法需要兼容(即根据equals(Object)需要相同的两个对象hashCode()),否则会发生各种奇怪的错误(例如,将对象添加到集合或映射时)。


查看完整回答
反对 回复 2019-08-28
?
慕仙森

TA贡献1827条经验 获得超8个赞

==比较对象引用,并询问两个引用是否相同。

equals()比较对象内容,并询问对象是否代表相同的概念。


查看完整回答
反对 回复 2019-08-28
?
holdtom

TA贡献1805条经验 获得超10个赞

在基元的情况下,==操作员检查两个值是否相同。

如果它不是基元,则检查它是否是指向对象的同一实例的两个指针(或引用)。


该equals()方法执行自定义检查Object,通过使用检查引用==。但在其他课程中,有时会equals()被覆盖(我不知道这是否是正确的过去分词)。equals()必须检查内容。


所以,例如:


int i0 = 34;

int i1 = 34;

int i2 = 35;

// results

i0 == i1: true

i1 == i0: true

i2 == i0: false

但如果我们有非基元


String str0 = new String("Hello man!");

String str1 = new String("Hello man!");

String str2 = new String("!nam olleH");

String str2copy = str2;

// Results

str0 == str1: false // Pointer to two different object, so == will give false

str1 == str2: false // Idem

str2 == str2copy: true // So this are two pointers to the same object

str0.equals(str1): true // This are not the same objects, but they are equal

str1 == str1: true // Again: two times a pointer to the same  object

那么,为什么要str0.equals(str1)回归true?因为String类具有覆盖equals()。并且在该方法中,它不会通过执行来检查它们是否相等return this == obj;但是在该方法中,存在完整的检查。我不知道他们使用哪种方法来比较两个字符串,但这里有两种可能的方法:


从两个字符串生成一个哈希码并检查它们是否相等(int == int)

如果字符相同,则逐字符检查。

所以我希望现在很清楚。


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 432 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信