关于java:等于两个对象,但它是假的

equals two objects but it's false

本问题已经有最佳答案,请猛点这里访问。

我一直在尝试用equals()方法和==方法来处理两个Baby对象,但都给了我false对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Baby {
    String name;

    Baby(String myName) {
        name = myName;
    }

    public static void main(String[] args) {
        Baby s1 = new Baby("a");
        Baby s2 = new Baby("a");
        System.out.println(s2.equals(s1));
        System.out.println(s1 == s2);
    }

}


您的输出是正确的:如果使用==操作,s1实际上并不等于s2,因为它们是不同的独立实例,这正是==检查的。由于baby不重写equals方法,因此对它的调用将默认为==操作,返回false。相反,您应该让类重写public boolean equals(Object o)方法,并在需要时调用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Baby {
   String name;

   Baby(String myName) {
      name = myName;
   }

   @Override
   public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((name == null) ? 0 : name.hashCode());
      return result;
   }

   @Override
   public boolean equals(Object obj) {
      if (this == obj)
         return true;
      if (obj == null)
         return false;
      if (getClass() != obj.getClass())
         return false;
      Baby other = (Baby) obj;
      if (name == null) {
         if (other.name != null)
            return false;
      } else if (!name.equals(other.name))
         return false;
      return true;
   }

   public static void main(String[] args) {
      Baby s1 = new Baby("a");
      Baby s2 = new Baby("a");
      System.out.println(s2.equals(s1));
      System.out.println(s1 == s2);
   }


}

哦,别忘了重写hashCode(),这样你就不会有两个相等的对象,而是有两个不同的哈希码——而不是犹太洁食!


如果s1s2是同一对象,s1 == s2只对true进行评价。他们不在你的情况下。它们是不同的对象,尽管内容可能相同。

.equals方法(如果实现正确,这是您的工作)比较内容,因此在您的情况下,将返回true


看到这个问题:Java中的=VS相等()是什么区别?

这就解释了==和使用.equals()方法的区别。

或者这个有用的视频。


除非重写equals,否则它将告诉您s1和s2确实是不同的对象。他们是两个不同的婴儿,恰好有相同的名字。:)