在java中重写具体类型的equals()有什么好处吗?
我需要比较数百个点,以找到二维网格上的路径,我真的在寻找性能。 我在我的在java中重写具体类型的equals()有什么好处吗?,java,android,2d,equals,avian,Java,Android,2d,Equals,Avian,我需要比较数百个点,以找到二维网格上的路径,我真的在寻找性能。 我在我的点的类中重写了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; }
点的类中重写了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;
}
这很好,因为可以将我的点
与对象(在ArrayList.contains()
中使用)进行比较,但我经常需要在它们之间比较点
。
所以我重载了equals()
:
问题是:第二种方法有什么好处吗?在直接比较两个点
实例且不需要instanceof和cast的情况下,这样比较两个点
实例是否更快:
boolean result = onePoint.equals(otherPoint);
关于平台:代码在android上使用android SDK(19)编译,在iOS上使用AOT编译
非常感谢。重载的equals()
方法使您的类和生活复杂化,可能没有什么实际好处。如果您测量了应用程序的性能,发现在Point.equals()
中花费了相当多的时间,那么寻找加速方法可能是合适的,例如提供更轻的过载。否则,不要这样做。引用另一个答案:
正如Donald Knuth所写,“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。”instanceof的性能可能不会成为问题,所以在确定问题所在之前,不要浪费时间想出奇异的解决方法
因此,不要使用自定义的equals
方法,除非您对程序进行了基准测试,并确定标准方法是一个瓶颈,这是极不可能的
可能还有其他方面可以改进。例如,您提到使用ArrayList.contains
,这是一个O(N)
操作。考虑使用<代码>设置>代码>,使之成为<代码> o(1)< /代码>。这只是一个例子。一个有趣的事实是,众所周知,程序员不善于猜测瓶颈。首先测量,然后将精力集中在实际需要的地方。实施Comparable并覆盖compareTo。如果您想要compareTo&equals,也可以使用comparator,如果您这样做正确,还可以执行Collections.Sort和其他功能,如binarysearch等
boolean result = onePoint.equals(otherPoint);