在java中为具体类型重写equals()有什么好处吗?

时间:2015-10-01 17:05:32

标签: java android 2d equals avian

我需要比较数百个点来查找2D网格上的路径,我真的在寻找性能。 我在equals()的课程中覆盖了Point

@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个。{1}}。 所以我重载了equals()

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

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

boolean result = onePoint.equals(otherPoint);

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

非常感谢。

2 个答案:

答案 0 :(得分:2)

引用其他答案:https://stackoverflow.com/a/103600/641955

  

正如唐纳德·克努特(Donald Knuth)所写,“我们应该忘记效率低下,大约97%的时间说:过早的优化是所有邪恶的根源。” instanceof的性能可能不会成为一个问题,所以在你确定这个问题之前,不要浪费你的时间来提出异乎寻常的解决方法。

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

可能还有其他一些可以改进的事情。例如,您提到使用ArrayList.contains,这是O(N)操作。请考虑使用Set代替O(1)。这只是一个例子。一个有趣的事实是程序员在猜测瓶颈方面非常糟糕。首先测量,并将能量集中在实际需要的地方。

答案 1 :(得分:0)

重载的equals()方法使您的班级和生活变得复杂,可能带来的实际好处很少。如果您测量了应用程序的性能并发现在Point.equals()中花费了大量时间,那么可能需要寻找加快速度的方法,例如提供重量更轻的过载。否则,不要。