即使在java中对象的状态相同,equals也给出false

时间:2015-06-16 10:58:18

标签: java

我的代码看起来有点像这样:

public class EqualityTrial {

  public static void main(String[] args) {
    // TODO Auto-generated method stub

    EqualityTrail1 obj1 = new EqualityTrail1();
    obj1.setName("Ankit");
    obj1.setAge(23);
    EqualityTrail1 obj2 = new EqualityTrail1();
    obj2.setName("Ankit");
    obj2.setAge(23);

    if(obj1 == obj2){
        System.out.println("== gave true");
    }else{
        System.out.println("== gave false");
    }
    if(obj1.equals(obj2)){
        System.out.println("equals gave true");
    }else{
        System.out.println("equals gave false");
    }

  }

}

每次条件都给出错误。 我知道==比较引用是否指向同一个对象,在这种情况下不是那么错误是正确的结果但是在等于'等于'方法,据我所知它比较两个对象的状态...如果状态是相同的方法应该返回true,在这种情况下返回false,即使两个对象的状态相同。我错过了什么吗?

5 个答案:

答案 0 :(得分:5)

equals仅在您使用比较状态的实现在EqualityTrail1类中覆盖它时才比较状态。如果不覆盖它,则使用默认实现(来自Object类),并且该实现比较引用(因此它的行为与==完全相同)。

可能的实施:

public class EqualityTrail1 
{
    ...
    @Override
    public boolean equals (Object other)
    {
         if (!(other instanceof EqualityTrail1))
             return false;
         EqualityTrail1 oet = (EqualityTrail1) other;
         return this.name.equals(oet.name) && this.age == oet.age;
    }

}

答案 1 :(得分:1)

如果你想要equals to work属性,你必须实现一个自己的equals变种(Object obj)。

在那里,您可以指定如何将“测量”等于应用于对象。

一些示例(使用Eclipse,Source选项卡):

public class MyClass {

  String sequence;

  public MyClass(String seq) {
    this.sequence = seq;
  }

  @
  Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((sequence == null) ? 0 : sequence.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;
    MyClass other = (MyClass) obj;
    if (sequence == null) {
      if (other.sequence != null)
        return false;
    } else if (!sequence.equals(other.sequence))
      return false;
    return true;
  }
}

答案 2 :(得分:0)

您是否重写过课程equals的{​​{1}}方法?如果不是这就是问题。如果是,则发布您的EqualityTrail1方法

答案 3 :(得分:0)

除非你提供equals的实现,它应该依次比较每个字段,否则Java将使用java.lang.Object中的默认版本,根据JLS:

  

类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

因此,由于你有两个不同的对象,默认情况下它们比较相等。

答案 4 :(得分:0)

我没有覆盖equals方法....在做同样的工作之后感谢。