簡體   English   中英

使用中間數組進行hashCode等於

[英]Using intermediate array for hashCode and equals

由於經常在兩個地方處理班級的結構變化,這很痛苦:

class A {
  class C{}
  class B{}
  private B bChild;
  private C cChild;

  private Object[] structure() {
    return new Object[]{bChild, cChild};
  }

  public int hashCode() {
      Arrays.hashCode(structure());
  }

  public boolean equals(Object that) {
    //type check here
    return Arrays.equals(this.structure(), ((A)that).structure());
  }
}

除了基元裝箱外,這種方法還有什么不好? 可以改善嗎?

這是重用庫方法的聰明方法,通常這是一個好主意。 但是它確實做了很多多余的分配和數組操作,這在這種常用方法中可能效率極低。 總而言之,我會說它很可愛,但是不會通過任何評論。

在JDK 7中,他們添加了java.util.Objects類。 它實際上以提醒您編寫內容的方式實現了哈希和equals實用程序。 關鍵是該方法實際上已由JDK開發人員批准。 歐內斯特·弗里德曼·希爾(Ernest Friedman-Hill)有一點要說,但在大多數情況下,我認為不值得為了節省可讀性而節省過多的機器指令。

例如:hash實用程序方法實現為:

public static int hash(Object... values) {
    return Arrays.hashCode(values);
}

熟悉代碼的人將很難看到正在發生的事情。 正如我以前的錯誤答案所表明的那樣,它沒有列出各個字段“那么明顯”。 的確,“等式”通常是通過傳入的“對象”來實現的,因此值得商but,但是輸入是在引用等式檢查之后進行轉換的。 這里情況不同。

一種改進可能是將數組存儲為私有數據成員,而不是使用structure方法創建它,這會犧牲一點內存以避免裝箱。

暫無
暫無

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

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