2015-10-01 25 views
1

我需要比較數百個點才能在2D網格上找到路徑,並且我非常期待性能。 我在Point的類中重寫equals()覆蓋java中的具體類型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和投不要求:

boolean result = onePoint.equals(otherPoint); 

關於平臺:代碼是在Android上使用的Android SDK(19)編制,它是在iOS上使用avian進行AOT編譯。

非常感謝。

+0

實現comparble並覆蓋compareTo。或者使用比較器,如果你想compareTo&等,http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html如果你這樣做是正確的,你也可以做Collections.Sort和其他功能如二元搜索等 –

回答

2

從這個對方的回答引用:https://stackoverflow.com/a/103600/641955

正如高德納寫道:「我們應該忘記小的效率,講的時候約97%:過早的優化是所有罪惡的根源。」 instanceof的性能可能不會成爲問題,因此,不要浪費時間尋找異常的解決方法,除非您確定問題所在。

因此,不要使用自定義的equals方法,直到您對您的程序進行基準測試並確定標準程序爲瓶頸,這是極不可能的。

您可能還有其他的改進方法。例如,您提到使用ArrayList.contains,這是一個O(N)操作。考慮使用Set來代替O(1)。這只是一個例子。一個有趣的事實是,程序員在猜測瓶頸方面是非常糟糕的。先測量一下,然後將能量集中在實際需要的地方。

0

超負荷的equals()方法會讓您的課堂和生活變得複雜,可能會帶來一些實際好處。如果測量了應用程序的性能,並發現任何可觀的時間花費在Point.equals()中,那麼尋找加快速度的方法可能是適當的,例如通過提供較輕的過載。否則,不要。

相關問題