2011-08-08 27 views
4

唯一有趣的是,爲什麼hashCode()在java.lang.String中不是靜態的? 而且在空返回的情況下,例如-1? 由於經常需要做somethihg,如:Java String hashCode爲空字符串

String s; 
............. 
if (s==null) { 
    return 0;} 
else { 
    return s.hashCode(); 
} 

感謝。

+0

如果是靜態的,它不會是一個非常有用的散列。 (並且注意hashCode是Object的一個方法。) –

+0

(當然,你可以編寫你自己的靜態myHash方法來檢查它的參數爲null。) –

+1

'static int hashCodeOf(Object o){return(o!= null )? o.hashCode():0; }' – oliholz

回答

14

正如其他人已經注意到的hashCodeObject上的方法,並且是非靜態的,因爲它固有地依賴(即屬於)對象/實例。

注意,Java 7中引入了Objects類,它有hashCode(Object)方法,它正是你想要的:返回o.hashCode()如果o非空或0其他。

該課程還有其他方法處理可能的值,例如equals(Object, Object),toString(Object)等。

1

它返回的hashCode不是一個類Object

7

因爲如果它是靜態的"1".hashCode()"2".hashCode()會返回相同的值,這顯然是錯誤的。

它是特定的每個實例,並受其影響,因此它不能是靜態的。

+1

錯誤:如果沿着非靜態[String.hashCode()]提供靜態'hashCode(String)'(http://docs.oracle.com/javase/7/docs/api/java/lang /String.html#hashCode%28%29),可以像這樣調用'String.hashCode(「1」)',或者如果忽略警告''2「.hashCode(」1「)'。這兩個調用都會返回相同的值。 –

+0

@bernardpaulus但問題不是關於'hashCode(String)',而是關於'hashCode()'(未參數化)。 – amit

+0

一個沒有參數的靜態'String.hashCode()'沒有多大意義(甚至不應該編譯,因爲它不能重載[Object.hashCode()](http://docs.oracle.com/javase/7/docs /api/java/lang/Object.html#hashCode%28%29))。另外,'foo()'表示法通常用於指示'foo'是一個函數,而不指定參數。 –

2

因爲String的哈希碼是該String的屬性。

使用相同的思路,您可以使每種方法都是靜態的。

2

hashCode用於獲取對象的hashCode,以便知道該對象必須放置在哪個桶中。因此它必須是對象的一個​​實例方法,並且必須以多態方式調用它。

null可用作HashMap中的鍵,但它被視爲一種特殊情況。

你似乎在使用hashCode來達到不同的目的,所以你必須以特定的方式來處理。