我正在深入研究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会被比较吗?
答案 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中的==
运算符会比较对象引用,以查看它们是否引用同一对象。由于您的变量a
和b
引用了不同的对象,因此根据==
它们并不相同。
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