2016-11-24 8 views
1

私はJoshua BlochのEffective Java 2nd Editionを読んでいます。その仕様に応じて自分のhashCodeメソッドによって返された正確な値が含まれ、このような文字列、整数、および日付などのJavaプラットフォームライブラリ、中hashCodeによって返される正確な値は何を意味しますか?

多くのクラス、この段落で

、彼がいることを言及しますインスタンス値のこれは、将来のリリースでハッシュ関数を改善する能力を厳しく制限するので、一般的には良い考えではありません。ハッシュ関数の詳細を指定せずに瑕疵が発見された場合や、より良いハッシュ関数が見つかった場合は、ハッシュ関数によって返された正確な値にクライアントが依存しないことを前提とした次のリリースで変更することができます。

「正確な」値で意味することを誰でも洞察してください。私はString実装クラスを見ても、彼が何を意味するのか理解できませんでした...

ありがとうございました! String.hashCode()から

+3

これは、 'hashCode()'によって返された値がJavadocで指定されていることを意味します。例えば['String.hashCode()'](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#hashCode())を参照してください。戻り値 –

+0

彼はおそらく次のようなものを意味していました: 's [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]' java.lang.String#hashCodeの[Javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#hashCode%28%29)に広告されているアルゴリズム。 – Mena

+0

'java.lang.Integer'では、単に"このIntegerオブジェクトが表すプリミティブなint値と等しい "です。 - [こちら](https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#hashCode%28%29)を参照してください。 – Mena

答えて

6

は、この文字列のハッシュコードを返します。 Stringオブジェクト のハッシュコードは、javadocの定義を与えることによって

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

として計算され、人々は、まさにそのハッシュアルゴリズムに依存したコードを書き込むことができます。将来のリリースでハッシュアルゴリズムを変更すると、そのコードが破損します。

+4

これをjavadocに書き込むことで、クラスのコントラクトの一部になるので、そのアルゴリズムに応じてコードを書くことも正しいです。 –

+0

@ piet.t正解ですが、あまり賢明ではありません。 :) – biziclop

+1

@biziclopあまり賢明でない動きは、Javadocの式を最初に指定することです。私は彼らに理由があると確信していますが... –

2

これは、hashCode()によって返される値がJavadocで規定されていることを意味します。

  • String.hashCode():この文字列のハッシュコードを返します

    。 Stringオブジェクトのハッシュコードは

    s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 
    
  • Integer.hashCode()ように計算される:

    [戻り]このIntegerオブジェクトが表すプリミティブint値に等しいこのオブジェクトのハッシュコード値、 。

  • Date.hashCode()

    は、このオブジェクトのハッシュコード値を返します。結果は、getTime()メソッドによって返されたプリミティブなlong値の2つの半分の排他的論理和です。これは、ハッシュコードは次の式の値です。

    (int)(this.getTime()^(this.getTime() >>> 32)) 
    
2

あなたがjava.lang.String.hashCode()のAPIドキュメントを見れば、それはメソッドが実装されている正確にどのように説明します

この文字列のハッシュコードを返します。 Stringオブジェクトのハッシュコードは、INT演算を使用して

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

として計算され、ここで、s [i]は文字列のi番目の文字であり、nは文字列の長さであり、^はべき乗を示します。 (空の文字列のハッシュ値がゼロである。)

ブロッホが、これはプログラマが数えることができることを意味するので、それは、そのようStringなどのクラスは、APIドキュメントで実装の詳細を説明することに間違いであるということである、と言う何この方法で実装されているhashCodeメソッドです。将来のJavaリリースで、Oracleが文字列のハッシュコードを計算するために、異なる、おそらくより効率的なアルゴリズムを実装したい場合、それは後方互換性の問題になります。この動作は以前のJavaバージョンと比較して変更される可能性があります。

実装をAPIドキュメントで詳しく説明することにより、実装される方法はJava APIの公式仕様の一部となっています。

一般に、APIドキュメントは、メソッドの目的が何であるかを正確に記述するだけで、実装方法を正確に記述する必要はありません。

関連する問題