【问题标题】:Equals method implementation for arrays - Java数组的 Equals 方法实现 - Java
【发布时间】:2019-08-22 22:13:50
【问题描述】:

我很惊讶这个 equals 方法有效.. 即使它使用的是 .equals,因为我已经覆盖了它,所以它不再以旧形式存在..?

我的意思是,如果您查看代码,比较我使用的两个数组元素.equals

但是.. 如果我要覆盖 equals 方法,.equals 不会只使用我覆盖的方法吗? 我有点困惑,我非常感谢您对它的工作原理进行一些解释。

public boolean equals(Object other) {
    if (other instanceof arrayClass) {
        arrayClass that = (arrayClass) other;
        if (this.number == that.number) {
            for (int i = 0; i < this.number; i++) {
                if (this.elements[i].equals(that.elements[i])) {

                }
                else {
                    return false;
                }
            }
            return true;
        }
        else {
            return false;
        }
    }
    else {
        return false;
    }
}

注意:number 表示数组长度。

提前致谢!

【问题讨论】:

  • 什么是elements?请提供minimal reproducible example
  • 但是您正在比较的两个数组元素与您正在比较的对象(thisthat)与您的 equals 实现不同,所以它是 @987654332 的另一个实现@

标签: java equals overwrite


【解决方案1】:

我很惊讶这个 equals 方法有效.. 即使它使用的 .equals 不再以旧形式存在,因为我已经覆盖了它

您已经为 arrayClass 类覆盖了 equals 方法。在equals 的实现中,您正在为数组的元素调用equals,这意味着您正在调用类的equals 方法,它是elements 数组的元素类型。例如,如果elementsString[],则elements[i].equals() 调用Stringequals

【讨论】:

    【解决方案2】:

    for 循环中的 equals 调用不会调用您的 equals 实现。您的实现在 Array 类之上,for 循环中的 equals 为您存储在数组中的任何类类型调用 equals 实现。

    另外,这段代码没有优化。您可以删除 for 循环内的空块:

    for(int i = 0; i < this.number; i++){
        if (!this.elements[i].equals(that.elements[i])) {
              return false;
        }
    }
    return true;
    

    【讨论】:

    • re:“也”建议。如果if (something) { } else { return; } 被编译为比if (!something) { return; } 效率低的代码,我会感到非常惊讶。请注意,我同意第二种形式是可取的 - 但这是为了读者的利益,而不是计算机。
    • 呵呵,我懂你。当然字节码不会改变。但是想想测试用例、PMD、checkstyle。它有所作为。也许“优化”这个词不是最好的选择。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2012-10-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多