[英]Overriding HashCode() in Java with double values
我知道這個問題被問了很多,而且我不知道我是否很了解哈希碼,但是它應該是地址,因此,如何解決我的特定示例? 如果我的理解是正確的,則我的班級中有雙打,但由於以下原因,我無法將它們添加到哈希碼中
possible loss of precision
found : double
required: int
return this.area();
這是我的Shape
類:
abstract class Shape implements Comparable<Shape>
{
abstract double area();
public int compareTo(Shape sh){
return Double.compare(this.area(),sh.area());
}
public int hashCode() {
return this.area();
}
public boolean equals(Shape sh) {
if ( sh instanceof Shape && this.area()==sh.area() ) {
return true;
} else {
return false ;
}
}
}
在hashCode()?
area()
是我唯一需要擔心的值hashCode()?
您可以在Double類中使用hashCode的示例:
public int hashCode() {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
這樣可以避免簡單地將double轉換為int引起的精度損失。
如果area是確定hashCode的唯一屬性,則可以使用完全相同的代碼,用area
代替value
。
但是,我不確定area
是否適合進行hashCode計算,因為它本身是根據Shape的子類的屬性計算得出的。 您可能應該根據Shape的每個子類的特定屬性實現hashCode。
不要將數字加在一起就產生哈希碼; 對於不相等的對象,很可能會得到重復的哈希碼。 相反,我建議使用標准Java API中的Objects.hash
方法或Apache Commons-Lang中更具表現力和效率的HashCodeBuilder
。 您應該在hashCode
計算中完全包含用於確定equals
的相同字段。
當然,作為@khelwood指出的那樣,你很可能不希望實現equals
和hashCode
這個抽象的對象,因為1×4矩形和一個2x2的矩形可能是不相等的。 相反,您可以在Shape
上將這些方法重新聲明為abstract
方法,以強制子類實現它們:
public abstract class Shape {
@Override
public abstract int hashCode();
}
您可以這樣做:
public int hashCode() {
return Double.valueOf(this.area()).hashCode();
}
-版本:更正的valueOf方法名稱。 謝謝@ user4254704。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.