Java(Equals方法)

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

}

}

上述代码有什么问题?理想情况下,它应该打印出"They are equal",但我得到的输出是"They are not equal"。

2
你必须在employee类中覆盖hashcode和equals方法。 - s_bei
1
@jackk 不是那个问题的重复。OP没有比较字符串,OP没有使用==,而且如果他这样做了,OP的代码也不会起作用。 - Andy Turner
@AndyTurner:实际上,他在使用“==”比较运算符,只是在他的代码中不够清晰。 - Stultuske
@Stultuske 对不起,你在哪里? - Andy Turner
@AndyTurner:他使用了Object类中的equals方法,该方法是进行==比较。 - Stultuske
8个回答

7

你需要在你的类中实现equals方法。

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

添加以下方法将适用于您。

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

2
Objects.equals(name, c.name) 更好。 - user4910279
我认为他现在只是试图理解“等于”这个概念。 - codingenious
你写的正是我想为 OP 写的内容。 :) - user3437460

3
为了让if(emp2.equals(emp3))能够正常工作,您需要覆盖Employee类中equals方法的默认行为。
@Override
public boolean equals(Object other){
    /// your implementation of equals ..
}

表单对象类 equals方法文档

请注意,通常需要重写hashCode()方法,以便在覆盖此方法时保持hashCode()方法的一般契约,该契约规定相等的对象必须具有相等的哈希码。


当将等号更改为使本来不相等的对象相等时,必须同时更改hashCode以使这些对象具有相同的哈希码。 - Patricia Shanahan

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


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,因为你可以在构造函数中传递null值作为名称。

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

这不是 equals 方法的重写。非常糟糕的设计。 - Stultuske
修改后:为什么不直接返回 this.name.equals(emp2.name) && this.rollno == emp2.rollno;? - Stultuske

0

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

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

你需要重写这个equals()方法,使得两个不同的对象相等。

0
根据Java文档,Object类的equals方法实现了对象之间最具有区分性的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一个对象(x == y的值为true)时,该方法返回true。
/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);

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

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


0

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


2
也许需要更多的信息。这似乎更像是一条评论而不是一个答案。 - Stultuske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接