Java(Equals方法)

Java(Equals方法),java,Java,上面的代码有什么问题??理想情况下,它应该打印“它们相等”,但我得到的输出是“它们不相等”为了使这项工作if(emp2.equals(emp3))您需要覆盖Employee类中equals方法的默认行为 class Employee{ private String name; private int rollno; public Employee(String name,int rollno) { this.name=name; this.rollno=rollno;

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

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

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

}

}
@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()
方法,以便维护
hashCode()
方法的一般约定,该约定规定相等的对象必须具有相等的哈希代码


您需要在类中实现
equals
方法

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

添加以下方法将对您有效

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

您需要重写Employee类中的equals方法

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

创建两个对象时,此操作将失败

作为类的创建者,只有您才能知道这些类的对象何时应该被视为相等,即使它们是单独的实例

你可能需要像这样的东西

@Override
public boolean equals(Object o) {

    // If the object is compared with itself then return true  
    if (o == this) {
        return true;
    }

    /* Check if o is an instance of Complex or not
      "null instanceof [type]" also returns false */
    if (!(o instanceof Employee)) {
        return false;
    }

    // typecast o to Complex so that we can compare data members 
    Employee c = (Employee) o;

    // Compare the data members and return accordingly 
    return (rollno == c.rollno && Objects.equals(name, c.name))
}

<>请记住,每当你执行<代码>等于时,你也应该考虑执行<代码> hash码< />代码>

,因为你自己不重写ToShin方法,它实际上使用了Objest.< /P>的版本。 这实际上是:

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;
}
在您的示例中,您的对象确实具有相同的值,但引用不相同,因此失败

加:

为了完全对齐:还要重写hashCode方法


请务必理解,我上面写的equals方法不可能抛出NullPointerException,因为您可以将null作为名称传递给构造函数。

将其放在employee类中

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

}

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

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

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

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

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

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


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

必须在中重写hashcode和equalsemployee@jackk不是那个的复制品。OP没有比较字符串,OP没有使用
==
,而且OP的代码无论如何也不会工作。@AndyTurner:事实上,他使用的是==比较,只是在他的代码中没有那么清楚。@Stultuske抱歉,在哪里?@AndyTurner:他使用来自对象的equals方法,这是==比较。当更改equals以使对象相等时,如果不是相等,则必须更改hashCode以使这些对象具有相同的哈希代码。
objects.equals(name,c.name)
好多了。我想他现在只是想理解equals。你写的正是我想为OP.写的:)这不是对equals方法的重写。编辑后非常糟糕的设计:为什么不->返回this.name.equals(emp2.name)&&this.rollno==emp2.rollno?也许再多了解一点。这似乎更多的是一个评论,而不是一个答案。
/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);