簡體   English   中英

用雙精度值覆蓋Java中的HashCode()

[英]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指出的那樣,你很可能希望實現equalshashCode這個抽象的對象,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM