2017-10-14 104 views
0

因此,很长一段时间以来,我认为使用equals()来比较对象,它使用hashcode(),这意味着如果2个对象具有相同的哈希代码,则返回true。如何在java中比较对象?

的equals()方法从源代码方法:

@see java.lang.System #identityHashCode 
public boolean equals(Object obj) { 
     return (this == obj); 
    } 

所以我创建这样的:

public static void main(String[] args) { 
     Dog rover = new Dog("Rover"); 
     Dog german = new Dog("Rover2"); 

     System.out.println("German: " + german + "\tRover: " + rover); 
     System.out.println(german.equals(rover)); 


    } 

此外,我重写哈希码()到:

@Override 
    public final boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
    } 

    @Override 
    public int hashCode() { 
     //The main point of 0 is to check how equals actually work 
     return 0; 
    } 

现在即使两个对象都是@ Dog0,print语句也会打印false。 奇怪,为什么 控制台:

German: [email protected] Rover: [email protected] 
false 

回答

1

您使用equals为“别名”为this == obj比较这是错误,这就是为什么它不工作。

对象有equals方法,因为如果this == obj实际上是相同的对象(内存中的相同引用),则它只返回true。

您需要做的是手动比较equals方法中的属性,并且只有匹配时才返回true。

+0

所以当处理对象时,它会查找内存地址而不是哈希码来返回true? – Bishop

+0

是的,确切地说。它看起来是否“指向”同一个对象,并且与散列码无关。 – Aenadon

1

的原因,他们不是“平等”无关的散列码。

的原因它们不相等是此条件:

this == obj 

返回true仅当obj相同对象作为this
您有2个对象,因此不能为真。

此外,从源代码中可以看到,调用equals()不会调用hashCode()。 AFAIK,有没有的实现(无论如何在JDK中),其中equals()调用hashCode()

+0

也许会出现混淆,因为Object的'toString()'是如何实现的。它打印出:'getClass()。getName()+'@'+ Integer.toHexString(hashCode())''''和'bject'的默认'hashCode()'实现将对象的**内部地址**转换为整数。这个内部地址也是'=='运算符正在使用的内容,因此造成混淆。 –

+0

也许值得将它添加到您的答案:equals()和hashCode()通过契约绑定在一起:如果o1.equals(o2)返回true,那么o1.hashCode()== o2.hashCode也必须为true。相反的情况并非总是如此:两个对象可以具有相同的哈希代码,但equals可能会返回false(即非常大的字符串)。 – Heri