【问题标题】:Equals method of Object and Object in Array数组中对象和对象的equals方法
【发布时间】:2015-05-23 20:29:00
【问题描述】:

我只是想在客户列表中查找对象的位置,尽管当我使用 equals() 方法时它不断返回 false。

我现在知道您必须创建自己的 equals 方法来覆盖自动方法,但是当我在 Customer 数组中比较 Customer 时,我不明白如何创建一个。

这是我的实例变量:

private Customer[] data;
private int size;
private final static int INITIAL_SIZE = 20;

这是我找到对象位置的方法:

public int findCustomerLocation(String name)
{
int spot = -1;
Customer cus = new Customer(name);
  for(int i = 0; i < size ; i++)
  {
    if((data[i].equals(cus)))
    {
      spot = i;
      System.out.println("spot is:"  + spot);
    }
    else
    {
      System.out.println("spot not found");
    }
  }
 return spot;
}//findCustomerLocation

(未找到返回点)

我正在尝试重写 equals 方法,但我有点卡住了,如果它是另一个实例,我正在尝试使用,但它仍然返回 false

【问题讨论】:

  • 显示您的Customer 课程。
  • @ElliottFrisch 不,他正在尝试为数组实现contains()。问题是他的equals() 方法坏了。

标签: java object compare


【解决方案1】:

您的 equals 方法只使用与默认 Object#equals() 相同的身份运算符 (==)。大概您打算让Customer 对象在它们内部的某些特定信息(例如 ID 字段)相等时被视为相等。如果是这样,您需要比较 equals() 中的这些字段(并且您应该始终将 equals() 中涉及的每个字段都包含在您的 hashCode() 中)。

您可能正在寻找这样的东西:

public boolean equals(Object other) {
    if(!other instanceof Customer) {
        return false;
    }

    Customer that = (Customer) other;
    return this.name.equals(that.name);
}

【讨论】:

  • 我包含了我的Customer 课程,客户只是名字,所以我试图查看某个客户是否已经在列表中,即他们的名字是否相同。我从来没有做过hashCode()
  • @hello 正如the Javadoc 中所述,当您覆盖equals() 时,您应该始终覆盖hashCode(),否则可能会发生坏事。如果你只有一个字段,比如这个,你可以使用它的哈希码:return name.hashCode()
  • 如果 this.name 为空,则失败。你应该使用java.util.Objects.equals(Object a, Object b)
【解决方案2】:

equals 方法应实现指示给定对象是否“等于”当前 (this) 对象的逻辑。从逻辑上讲,它不应该依赖不是类成员的字段或参数。在您的情况下,您不应该在 equals 方法中使用 data 数组或 size 字段。只需在Customer 的相应字段上添加检查即可。

例如,假设Customer 有一个名为name 的字段,那么下面的equals 会检查两个Customer 是否相等,如果它们具有相同的name

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }

    if (obj == null) {
        return false;
    }

    if (getClass() != obj.getClass()) {
        return false;
    }

    Customer other = (Customer) obj;
    if (name == null) {
        if (other.name != null) {
            return false;
        }
    } else if (!name.equals(other.name)) {
        return false;
    }
    return true;
}

如果您使用的是 Eclipse 之类的 IDE,则有一些快捷方式可以以一致的方式自动覆盖 equals()hashCode() 方法。通常,这两个方法应该使用相同的类成员,这样如果两个对象相等,它们的哈希码值就相同。

【讨论】:

    【解决方案3】:

    您正在比较 Customer 对象,而不是它们的名称。由于它们不是同一个对象,equals() 将返回 false。要解决此问题,请将以下代码添加到 Customer:

    public boolean equals(Object obj){
        if(obj instanceof Customer){
            Customer c = (Customer)obj;
            if(c.name.equals(this.name)
                return true;
        }
        return false;
    }
    

    编辑:抱歉重复的帖子,请查看 chrylis 的帖子,并在 instanceof 语句之前插入 obj != null

    祝你好运!

    【讨论】:

      【解决方案4】:

      请注意,当您实现equals 时,您必须实现hashCode。有一些things to consider可以正确编写这些方法。为了安全起见,最好让 IDE 生成这些方法。例如在 Eclipse 中,去 Source > Generate hashCode() and equals()...

      【讨论】:

      • 他实际上想要一个equals 来换取Customer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多