Java中的==、equals和hashcode示例

5
鉴于这个前提:
String s1= new String("abc");
String s2= new String("abc");
String s3 ="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());

输出结果为:
false
false
true
true
96354
96354
96354

这里每个对象都返回false,但每个String对象的哈希码是相同的。为什么会这样呢?

4个回答

11

== 比较的是 对象 的实际相等性(我指的是-两个引用是否指向同一个对象),而不是它们的内容,而 .equal 则比较内容(至少对于String来说)。

String a = new String("aa");
String b = new String("aa"); 

ab 指向不同的对象。

需要注意的是,如果两个对象相等,则它们的哈希码必须相同,但如果哈希码相同,则并不意味着这两个对象相等。


8
等价关系要求如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()。但它并未明确规定不相等对象的哈希码。你可以编写如下方法:
public int hashCode()
{
    return 42;
}

并且它将履行合同。只是期望哈希码与对象的值相关,以使哈希表工作更有效。

现在,为什么你的==不起作用,两个对象总是按引用比较。也就是说,如果o1 == o2,那么o1o2是完全相同的对象。这很少是你想要的;通常你想看看o1.equals(o2)是否成立。


3
当你使用==时,你正在比较两个变量是否持有对同一对象的引用。换句话说,s1 == s2就像在问:变量s1s2是否引用同一个字符串对象?即使两个字符串对象具有相同的"abc"值,这也是不正确的。
当你使用equals()时,你正在比较两个对象的值。两个对象可能不相同,但它们的值(在本例中为"abc")相同,因此返回true
如何定义一个对象是否等于另一个对象?这取决于你。在本例中,String对象已经为你定义了这个方法,但例如,如果你定义了一个Person对象,如何知道一个人P1是否等于P2?你需要覆盖equals()hashCode()方法。

0

“==”仅告诉您两个变量引用是否指向内存中的同一对象,没有更多信息。而equals()hashCode()都会查看对象的内容,并且每个方法都使用自己的算法进行计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接