如何equals()方法的作品(How equals() method works)

2019-08-31 12:30发布

我挖成Java的基本知识。 我由此推断文章 ,即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语言equals方法

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

在我上面的例子中,a.equals(二)返回true,表示条件的== b为满足。 但后来为什么== b的回归在例如假的?

不哈希码和地址一个相同的? 同样,当我们说一个== B或别的东西是比较的hashCode?

Answer 1:

String类已覆盖了equals()方法。 请按照字符串#equals()方法的文档。

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

这是默认实现equals()Object类, String类重写了默认的实现。 当且仅当参数不是null,并且是代表相同的字符序列与此对象的String对象返回TRUE。

不哈希码和地址一个相同的?

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



Answer 2:

不,Hashcode方法和地址是不一样的。

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

是的,别的东西,当我们说一个== b的比较。

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

此外,仅仅因为“相等的对象具有相同的散列码”并不意味着“平等的哈希码是指相等的对象”。



Answer 3:

==在Java中操作比较对象引用,看看他们是否指向同一个对象。 因为你的变量ab指向不同的对象,他们根据不相等==

hashCode方法不返回地址String ,因为那类已重写hashCode

此外, equals法已经实施String比较字符串的内容; 这就是为什么a.equals(b)返回true在这里。



Answer 4:

a.equals(b)是从一个== b处。

a.equals(b)中检查两个对象是否基于equals()方法执行平等。

一个== b检查是否两个对象具有相同的附图。

如果一个== b为真,那么a.equals(B),因为它们引用到同一个对象,但反之则不行,必须是真实的。



Answer 5:

String类覆盖了equals的默认实现(Object类的方法。 您所提供的equals方法的代码是不是从String类,但是从Object类,它覆盖是String类执行, 检查,如果两个对象的内容是相同的或没有。



Answer 6:

一个对象哈希码是为了覆盖。

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

S [0] * 31 ^(N-1)+ S [1] * 31 ^(N-2)+ ... + S [N-1]

我建议您搜索为什么31已被用作一个乘数,而不是其他一些数字。

对于重写哈希代码的一般经验法则是,对于不同的对象的散列码应该是不同的尽可能。

为了实现这一目标,建议您考虑每一个显著场中的目标,而计算哈希值。

注:只是一个无关的深思(来源:有效的Java):考虑以下实现的hashCode

int hashcode(){
     return 10;
}

这是一个有效的实现,但它也是最糟糕的一个。 阅读关于为什么。



Answer 7:

A和B是产生由于相同的散列码两个单独的对象String的实施hashCode()==只是检查是否在左,右两侧具有相同的参考。 它不会调用Objectequals()的方法。

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



文章来源: How equals() method works
标签: java equals