equals()方法的工作原理

时间:2013-04-18 17:15:41

标签: java equals

我正在深入研究Java的基础知识。 我从这个article推断,java equals方法意味着,如果两个对象相等,那么它们必须具有相同的hashCode()。

这是我的例子。

public class Equals {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("a"); 
        String b = new String("a");
        System.out.println("a.hashCode() "+a.hashCode());
        System.out.println("b.hashCode() "+b.hashCode());
        System.out.println(a == b); 
        System.out.println(a.equals(b));

    }

}

输出:
a.hashCode()97
b.hashCode()97

真的

实际Java语言等于方法

  public boolean equals(Object obj) { 
    return (this == obj); 
  }

在上面的例子中,a.equals(b)返回true,意味着满足条件a == b。但那么为什么a == b在那个例子中返回false?

hashCode和地址不一样吗? 另外,当我们说a == b或其他什么时,hashCode会被比较吗?

8 个答案:

答案 0 :(得分:13)

String类已覆盖equals()方法。请按照String#equals()文档进行操作。

a.equals(b)返回true,表示满足条件a == b

这是equals()类中Object的默认实现,String类已覆盖默认实现。当且仅当参数不为null并且是表示与此对象相同的字符序列的String对象时,它才返回true。

不是hashCode和地址一样吗?

不一定,有关hashCode()的进一步阅读。

答案 1 :(得分:3)

不,哈希码和地址不一样。

因为= = b不比较哈希码。

是的,当我们说a == b。

时会比较其他内容

(这不是地址,真的,但它足够接近)。

另外,仅仅因为“相等对象具有相同的哈希码”并不意味着“相等的哈希码意味着相等的对象”。

答案 2 :(得分:2)

Java中的==运算符会比较对象引用,以查看它们是否引用同一对象。由于您的变量ab引用了不同的对象,因此根据==它们并不相同。

hashCode方法未返回String中的地址,因为该类有overridden hashCode

此外,String方法已在a.equals(b)中实现,以比较字符串的内容;这就是true在这里返回{{1}}的原因。

答案 3 :(得分:1)

a.equals(b)不同于a == b。

a.equals(b)基于equals()实现检查两个对象是否等于。

a == b检查两个对象是否具有相同的引用。

如果a == b为真,则a.equals(b)必须为true,因为它们引用同一个对象,反之则不然。

答案 4 :(得分:1)

String class 会覆盖Object类的equals()方法的默认实现。您提供的equals方法代码不是来自String类,而是来自Object类,它被重写为String类实现,检查两个对象的内容是否相同。

答案 5 :(得分:1)

要覆盖对象的哈希代码。

对于String类,使用的公式如下:

s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]

我鼓励您搜索为什么31被用作乘数而不是其他数字。

覆盖哈希码的一般拇指规则是,对于不同的对象,哈希码应尽可能不同。

为实现此目的,建议您在计算哈希值时考虑对象的每个重要字段。

注意:只是一种无关的思考(来源:Effective Java): 考虑以下哈希码的实现

int hashcode(){
     return 10;
}

这是一个有效的实现,但它也是最糟糕的实现。了解原因。

答案 6 :(得分:0)

A和B是两个独立的对象,由于String的{​​{1}}实现,它们生成相同的哈希码。 hashCode()只是检查左侧和右侧是否共享相同的引用。它不会调用==的{​​{1}}方法。

所以,不,哈希和对象引用是一样的。

答案 7 :(得分:0)

public class TestEquals {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("a"); 
        String b = new String("a");
        System.out.println("a.hashCode() " + a.hashCode());
        System.out.println("b.hashCode() " + b.hashCode());

        // Checks the reference which is something like the 
        // address & address is different from hash code which can be overriden
        System.out.println(a == b);

        // It returns true if and only if the argument is not null 
        // and is a String object that represents the same sequence 
        // of characters as this object. (String Implementation of equals)
        System.out.println(a.equals(b));
    }
}

输出:

a.hashCode() 97
b.hashCode() 97
false
true