我一直在使用Netbeans在Java中開發一段時間,並且有些事情我只是依靠工作而沒有真正質疑如何。其中包括自動生成的hashCode()和equals()方法。爲什麼Netbeans以它的方式生成hashCode()?
equals方法很簡單,但我發現hashCode方法有點神祕。我不明白爲什麼它會選擇乘數並應用它所做的操作。
import java.util.Arrays;
import java.util.Objects;
public class Foo {
int id;
String bar;
byte[] things;
@Override
public int hashCode() {
int hash = 7;
hash = 89 * hash + this.id;
hash = 89 * hash + Objects.hashCode(this.bar);
hash = 89 * hash + Arrays.hashCode(this.things);
return hash;
}
}
搜索文檔,本網站和谷歌的東西,如「netbeans生成哈希碼」,似乎沒有什麼相關的。有人在這裏熟悉這一代戰略是什麼,以及爲什麼Netbeans使用它?
編輯:
感謝您的回答!特別是由於this answer on the linked SO question,我理解現在使用primes來設計hashCode方法的邏輯要更完整。然而,至今沒有人真正解決過我的問題的另一個方面,那就是Netbeans如何以及爲何選擇它爲其生成的方法所做的素數。 hash
字段和其他乘數(在我的示例中爲89
)根據類的各種因素而有所不同。
例如,如果我添加第二個String
到類,hashCode()方法變得
public int hashCode() {
int hash = 7;
hash = 13 * hash + this.id;
hash = 13 * hash + Objects.hashCode(this.bar);
hash = 13 * hash + Objects.hashCode(this.baz);
hash = 13 * hash + Arrays.hashCode(this.things);
return hash;
}
那麼,爲什麼選擇Netbeans的這些具體素數,而不是任何其他人?
我認爲這只是一種方法,IntelliJ IDEA使用31 –
乘以31很容易優化到一個移位和一個減號,不知道約89.兩者都應該是素數。 – zapl
一個好的選擇是:'返回Objects.hash(id,bar,baz,things);'或多或少都是一樣的東西。 – assylias