簡體   English   中英

HashCodeBuilder的用法,以及如何以及為什么為具有字段的對象計算Java hashCode?

[英]HashCodeBuilder use, and How and Why are Java hashCode computed for objects with fields?

我敢肯定有一個很好的理由,但是您能否請您解釋一下為什么.equals()和.hashCode()不使用反射只是“工作”?

例如在:

class Test {      
  Integer x = 1, y = 2;
}

Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2)); // returns false
System.out.println(t1.hashCode() == t2.hashCode()); // returns false

我正在使用HashCodeBuilder和EqualsBuilder來獲得簡單對象的一致哈希,如下所示:

class Test {      
  Integer x = 1, y = 2;

  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
  }

  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
  }
}

Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2)); // returns true
System.out.println(t1.hashCode() == t2.hashCode()); // returns true

您能否評論這是否是正確的方法?

HashCodeBuilder和EqualsBuilders不是JDK的一部分,它們是Apache Commons Lang項目的功能。 Java不使用反射來“猜測”正確的等號和哈希碼操作,因為知道程序員的意圖是不可能的。 默認情況下,對象確實具有默認的哈希碼和equals方法(這就是您覆蓋它們的原因),並且每個對象都有一個偽唯一的哈希碼,並且僅與自身相等。

在某些程序中,使每個對象具有唯一性的相等性和哈希碼,而不是在運行時反思檢查字段可能是正確的。 在其他程序中,忽略某些字段並具有相等性和哈希碼的程序員可能只對對象字段的子集進行操作。 程序員可能打算或不希望使用許多可能性和字段組合來實現相等性,這就是Java做出最安全的假設並使每個對象僅與自身相等的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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