为 java 中的具体类型覆盖 equals() 有什么好处吗?

Is there any benefit to override equals() for concrete type in java?

我需要比较数百个点才能在 2D 网格上找到路径,我真的很在意性能。 我在 Point 的 class:

中覆盖了 equals()
@Override
public boolean equals(Object o)
{
    if (o instanceof Point)
    {
        Point that = (Point) o;
        return that.i == this.i && that.j == this.j;
    }
    return false;
}

这很好,因为可以将我的 Point 与对象(在 ArrayList.contains() 中使用)进行比较,但我经常需要在它们之间比较 Point。 所以我重载了 equals():

public final boolean equals(Point other)
{
    return (i == other.i) && (j == other.j);
}

问题是:第二种方法有什么好处吗?在直接比较两个 Point 实例且不需要 instanceof 和 cast 的情况下比较它们是否更快:

boolean result = onePoint.equals(otherPoint);

关于平台:代码是在android上使用androidSDK(19)编译的,在iOS上使用avian进行AOT编译。

非常感谢。

重载的 equals() 方法使您的 class 和您的生活变得复杂,可能没有什么实际好处。如果您 测量了应用程序的性能 并发现在 Point.equals() 上花费了相当多的时间,那么寻找加速它的方法可能是合适的,例如通过提供更轻的重量过载。否则不要。

引用其他答案:

As Donald Knuth wrote, "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." The performance of instanceof probably won't be an issue, so don't waste your time coming up with exotic workarounds until you're sure that's the problem.

所以不,在您对程序进行基准测试并确定标准方法是瓶颈之前,不要使用自定义 equals 方法,这种情况极不可能发生。

您可能还有其他可以改进的地方。例如,您提到使用 ArrayList.contains,这是一个 O(N) 操作。考虑使用 Set 来代替 O(1)。这只是一个例子。一个有趣的事实是,众所周知,程序员不善于猜测瓶颈。先衡量,把精力用在真正需要的地方。