2011-08-08 4 views
4

興味深いのは、java.lang.StringのhashCode()メソッドが静的でない理由は何ですか? そしてヌル返品の場合。 -1? 頻繁ようsomethihgを行う必要があるため:Java文字列hashCode null string

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

感謝を。

+0

静的な場合は非常に便利なハッシュではありません。 (そして、hashCodeはObjectのメソッドであることに注意してください) –

+0

(nullのためのパラメータをチェックする独自のstatic myHashメソッドを書くことはもちろん可能です) –

+1

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

答えて

14

hashCodeは、Object上のメソッドであり、本質的にオブジェクト/インスタンスに頼っている(つまり、それに属している)ため非静的です。非nullまたは0そうですo.hashCode()oあれば返します。Java 7は正確に何をしたいんhashCode(Object)方法を、持っているObjectsクラスを、導入

注意。

equals(Object, Object),toString(Object)などの他の方法もあります。nullの値を扱うクラスもあります。

1

返されるhashCodeはObjectで、クラスではありません。

7

静的である場合は、"1".hashCode()"2".hashCode()が同じ値を返すため、明らかに間違っています。

インスタンスごとに固有であり、影響を受けるため、静的にすることはできません。

+1

間違っています:静的でない[String.hashCode()](http://docs.oracle.com/javase/7/docs/api/java/lang)に沿って静的な 'hashCode(String) /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は、オブジェクトのハッシュコードを取得するために使用され、HashMapのバケットが配置される必要があることを認識します。したがって、オブジェクトのインスタンスメソッドでなければならず、多態的に呼び出さなければなりません。

nullは、HashMapのキーとして使用できますが、特別なケースとして扱われます。

あなたは異なる目的でhashCodeを使用しているようですので、特別な方法で処理する必要があります。