所以我正在学习Java而我正在努力理解平等,但我真的不明白它。所以我的问题是:equals如何运作? 感谢
答案 0 :(得分:4)
equals
是一种用于发现两个给定对象是否相同的方法。对象的equals的默认实现是:如果它们具有完全相同的引用,它们是相同的。
有时候,你不想要这个。假设您有一个ComplexNumber
类,以及两个值为1+i
的实例。你不希望它们不相等只是因为它们是不同的实例。实质上,它们代表相同的数字。在这种情况下,您应该重写equals以确保其行为符合预期。
HashMaps使用来自等于的信息来知道你传递的密钥是否已经存在。
来自 Effective Java 一书:
总是覆盖哈希码 覆盖等于
我还要补充一点:特别是如果你使用的是Hashmap =)
Hashmaps还使用hashcode()来更快地搜索密钥,hashcode()
的结果必须与equals
结果一致。换句话说,如果是x.equals(y)
,那么x.hashcode() == y.hashcode()
(或者您的hashmap可能有未定义的行为)。您可能拥有x.hashcode() == y.hashcode()
和!x.equals(y)
如果您想要更具体的答案,请提出更具体的问题=)。
答案 1 :(得分:0)
equals方法将比较相等的值。
方法equals是在对象类中定义的,这意味着每个其他类都可以使用此方法来比较它的工作方式:它将首先检查它是否引用它的self然后是对象的haschode,以及它们是否相等如果是这样,它将检查该对象中的每个字段与您正在共同对象的字段,以及为什么您可能会询问co的haschode可能是相同的但它仍然可以包含其他值,即赔率低但需要的字段比较深入的话。
答案 2 :(得分:0)
equals()
表示“有意义的等效”。它与==
不同,这意味着“这些是同一个对象”。所有类都有equals()
方法,不在Object
类中。例如,假设您编写了一个存储make,model和owner的Car
类:
Car carOne = new Car("Buick", "LeSabre", "John Doe");
Car carTwo = carOne;
此处,equals()
和==
都将返回true,因为两个引用都指向同一辆汽车。但是,对于
Car carOne = new Car("Buick", "LeSabre", "John Doe");
Car carTwo = new Car("Buick", "LeSabre", "John Doe");
有两个不同的对象,因此==
返回false。但是,由于这两辆车都是由John Doe拥有的别克LeSabres,所以你的equals()
应该写成返回true(假设这个例子没有人拥有多辆相同类型的汽车)。
此外,正如Samuel指出的那样,如果你覆盖equals()
,你也应该覆盖hashCode()
;其原因超出了本问题的范围,并在其他地方有详细记载。