Java(等于方法)

时间:2015-12-22 08:59:45

标签: java

class Employee{

  private String name;

  private int rollno;

public Employee(String name,int rollno)
{

  this.name=name;

  this.rollno=rollno;

}

}

public class CT2{

public static void main(String[]args){

Employee emp1 = new Employee("Raghu",35);

Employee emp2 = new Employee("Raghu",35);

Employee emp3 = new Employee("Raghu",35);

if(emp2.equals(emp3))

 System.out.println("They are equal");

else

 System.out.println("They are not equal");

}

}

以上代码有什么问题?理想情况下,它应该打印“他们是平等的”,但我输出“他们不平等”

8 个答案:

答案 0 :(得分:5)

您需要在班级中实施 public BusinessEntities.FileParseResult Parse(string FilePath) { FileParseResult _fileParseResult = new FileParseResult(); _fileParseResult.FileParseResultType = FileParseResultType.ValidFileClaim; Logger.LogMessage(PREPROCESS_FILEPARSER.TRACE_MSG, "****WorkComp.Net : Pre Processor -> Start parsing valid AT XML File *****"); XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; using (XmlReader reader = XmlReader.Create(FilePath, settings)) { try { string tranmissionsattr = string.Empty; string header = string.Empty; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name.ToLower() == "transmissions") { for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); tranmissionsattr = tranmissionsattr + " " + reader.Name + "=\"" + reader.GetAttribute(i) + "\""; } reader.MoveToElement(); } } } } } 方法。

  

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

添加以下方法对您有用。

equals

答案 1 :(得分:3)

为了使该工作成为if(emp2.equals(emp3)),您需要覆盖Employee类中equals方法的默认行为。

@Override
public boolean equals(Object other){
    /// your implementation of equals ..
}

表单对象类equals method docs

  

请注意,一旦覆盖此方法,通常需要覆盖hashCode()方法,以便维护hashCode()方法的常规协定,该方法声明相等对象必须具有相等的哈希码

答案 2 :(得分:0)

您需要在Employee类中重写equals方法。

答案 3 :(得分:0)

如果不编写自己的equals() ,Java将使用默认值 - 比较对象标识。

当您创建两个对象时,这将失败。

作为类的创建者,只有可以判断,这些类的对象何时应被视为相等,即使它们是单独的实例。

你可能需要像

这样的东西
public boolean equals(Object o) {
  if(o instanceof Employee) {
    Employee other = (Employee)o;
    return this.rollno == other.rollno && this.name.equals(other.name);
  }
  return false;
}

请记住,无论何时实施equals,您都应考虑实施hashCode

答案 4 :(得分:0)

由于您没有自己覆盖toString方法,因此它实际上使用了Object的版本。

这实际上是:

public boolean equals(Object o){
  return this == o;
}

在您的示例中,您的对象具有相同的值,但没有相同的引用,因此,它失败。

添加:

@Override
public boolean equals(Object o){
  if ( !(o instanceof(Employee)){
    return false;
  }
  Employee t = (Employee)o;
  return this.name.equals(t.name) && this.rollno == t.rollno;
}

为了完全对齐:也覆盖hashCode方法。

请理解我上面写的equals方法不可能抛出NullPointerException,因为你可以将name传递给构造函数。

答案 5 :(得分:0)

把它放在员工类中。

public boolean equals(Object object){
    if(object instanceof Employee){
        Employee emp2= (Employee) object;
        if(this.name.equals(emp2.name) && this.rollno == emp2.rollno))
            return true;
        return false;
    }
    return false;
}

答案 6 :(得分:0)

目前,Employee对象emp2使用Object类的equals()方法来比较两个对象引用。下面的代码段显示了对象类equals()方法,

 public boolean equals(Object obj) {
        return (this == obj);
 }

您需要覆盖此equals()方法,以使两个不同的对象相等。

答案 7 :(得分:0)

根据java doc,类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);
Object的

equals()比较引用。 这就是为什么它是错误的,因为它们是不同的对象。 equals()旨在使用对象的内部状态进行比较。

要解决您的问题,需要在Employee类中重写equals方法。