Java等于和hashmaps问题

时间:2010-03-23 22:59:11

标签: java equals

所以我正在学习Java而我正在努力理解平等,但我真的不明白它。所以我的问题是:equals如何运作? 感谢

3 个答案:

答案 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)

的x和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();其原因超出了本问题的范围,并在其他地方有详细记载。