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

时间:2013-09-10 17:36:39

标签: java

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

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);
    }

}

4 个答案:

答案 0 :(得分:7)

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

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(),所以你没有两个对象相同但有两个不同的hashCodes - 不是犹太教徒!

答案 1 :(得分:2)

如果s1 == s2true相同的对象

s1将仅评估为s2。他们不在你的情况下。虽然内容可能相同,但它们是不同的对象。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

请参阅此问题:What is the difference between == vs equals() in Java?

解释了==与使用.equals()方法之间的区别。

helpful video