2012-10-30 78 views
2

如何在hashCode()方法中使用Objects#hash(Object...)使用Objects#hash(Object ...)用於hashCode方法?

int a = 1; 
boolean b = true; 
Date c = new Date(); 
String d = "1234"; 
Object e = new ch.example.blabla.Foo(); 

// Java 7 
public int hashCode() { 
    return Objects.hash(a, b, c, d, e); 
} 

// or using Java 6 
public int hashCode() { 
    return Arrays.hashCode(new Object[] {a, b, c, d, e}); 
} 
在正常情況下,例如具有 equals(Object)方法太等

當然。 Joshua Bloch在他的書中寫道,如何使用他的規則/配方(如移位等)編寫好的方法。

上面的例子並沒有遵循這些原則數據類型的規則......所以我的問題是,處理像對象(autoboxing)原始數據類型而不是遵循Bloch的配方或使用Apache Commons HashCodeBuilder

Objects#hash(Object...)是在Java 7中引入的,只調用Arrays.hashCode(Object[]),所以這個問題也是針對Java 6用戶的。

謝謝你的回覆/意見/建議!

+2

我認爲這確實遵循原始類型的規則(自動包裝的包裝器以相同的方式散列),但其缺點可能是由於所有垃圾產生的性能。 –

+1

如果現代jvm能夠優化所有的拳擊和陣列創建,我不會感到驚訝。 –

回答

3

Integer,DoubleBoolean這樣的包裝類確實實現了Joshua Bloch的Effective Java中描述的規則。感謝Marko Topolnik強調這一點。

他還提到了可能導致性能問題的不利因素。但是,JörnHorstmann認爲這可能會被現代JVM優化。

我們正在採用這種方法(Objects.hash(a, b, c)),因爲它比編寫我們自己的hashCode()方法更可讀。如果真的有必要(如果遇到性能問題)我們自己實現原始哈希代碼。

Marko,Jörn,謝謝您的意見。如果您要寫答案,我會將接受的答案改爲最佳答案。

+3

值得注意的是,Objects.hash不能很好地工作,因爲'Objects.hash'內部調用'Arrays.hashCode',所以如果你想要一個數組的哈希碼。正確的數組哈希碼生成需要'Arrays.deepHashCode'。 – Max

相關問題