Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中重写具体类型的equals()有什么好处吗?_Java_Android_2d_Equals_Avian - Fatal编程技术网

在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);