我挖成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?
String
类已覆盖了equals()
方法。 请按照字符串#equals()方法的文档。
a.equals(二)返回true,表示条件的== b为满足
这是默认实现equals()
的Object
类, String
类重写了默认的实现。 当且仅当参数不是null,并且是代表相同的字符序列与此对象的String对象返回TRUE。
不哈希码和地址一个相同的?
不一定,对进一步阅读的hashCode() 。
不,Hashcode方法和地址是不一样的。
因为== b不是比较哈希码。
是的,别的东西,当我们说一个== b的比较。
(这不是地址,可能是真的,但它是足够接近)。
此外,仅仅因为“相等的对象具有相同的散列码”并不意味着“平等的哈希码是指相等的对象”。
该==
在Java中操作比较对象引用,看看他们是否指向同一个对象。 因为你的变量a
和b
指向不同的对象,他们根据不相等==
。
和hashCode
方法不返回地址String
,因为那类已重写hashCode
。
此外, equals
法已经实施String
比较字符串的内容; 这就是为什么a.equals(b)
返回true
在这里。
a.equals(b)是从一个== b处。
a.equals(b)中检查两个对象是否基于equals()方法执行平等。
一个== b检查是否两个对象具有相同的附图。
如果一个== b为真,那么a.equals(B),因为它们引用到同一个对象,但反之则不行,必须是真实的。
String类覆盖了equals的默认实现(Object类的)方法。 您所提供的equals方法的代码是不是从String类,但是从Object类,它覆盖是String类执行, 检查,如果两个对象的内容是相同的或没有。
一个对象哈希码是为了覆盖。
对于String类所使用的公式如下:
S [0] * 31 ^(N-1)+ S [1] * 31 ^(N-2)+ ... + S [N-1]
我建议您搜索为什么31已被用作一个乘数,而不是其他一些数字。
对于重写哈希代码的一般经验法则是,对于不同的对象的散列码应该是不同的尽可能。
为了实现这一目标,建议您考虑每一个显著场中的目标,而计算哈希值。
注:只是一个无关的深思(来源:有效的Java):考虑以下实现的hashCode
int hashcode(){
return 10;
}
这是一个有效的实现,但它也是最糟糕的一个。 阅读关于为什么。
A和B是产生由于相同的散列码两个单独的对象String
的实施hashCode()
。 ==
只是检查是否在左,右两侧具有相同的参考。 它不会调用Object
的equals()
的方法。
所以,不,哈希和对象引用是不一样的东西。