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

cre*_*ive -1 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 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);
   }


}
Run Code Online (Sandbox Code Playgroud)

哦,不要忘记覆盖hashCode(),所以你没有两个对象相同,但有两个不同的hashCodes - 不是犹太教!