2016-05-25 1 views
2

valueの参照を変数valにコピーする目的は何ですか?それを直接使用することに反対しますか?String#hashCodeに値配列を参照するローカル変数があるのはなぜですか?

public int hashCode() { 
    int h = hash; 
    if (h == 0 && value.length > 0) { 
     char val[] = value; // private final char value[]; 

     for (int i = 0; i < value.length; i++) { 
      h = 31 * h + val[i]; 
     } 
     hash = h; 
    } 
    return h; 
} 
+0

不明ですが、メンバ変数は 'value.length'で引き続き使用されています。 –

+1

@AndyTurner、それは答えですよね? 'hashCode'の実行中に' value'が変更された場合、 'ArrayIndexOutOfBoundsException'を取得するか、単に欠陥のあるハッシュコードを計算することができます。 – aioobe

+0

@aioobe実行中に 'private final char [] value'がどのように変化し、その長さをチェックすると検出されるのでしょうか?そして、あなたは本当に 'val'の要素が変わることを期待しますか?' String'は不変です。 –

答えて

0

これは、地元の人々にMartin Buchholz

コピーによると、パフォーマンスの最適化である最小の バイトコード

も参照してください生成:
In ArrayBlockingQueue, why copy final member field into local final variable?


+----------------------+----------------------------+------------------------------+ 
| h = 31 * h + val[i]; | h = 31 * h + value[i];  | hash = 31 * hash + value[i]; | 
+----------------------+----------------------------+------------------------------+ 
| LINENUMBER 1471 L7 | LINENUMBER 14 L6   | LINENUMBER 13 L4    | 
| BIPUSH 31   | BIPUSH 31     | ALOAD 0      | 
| ILOAD 1    | ILOAD 1     | BIPUSH 31     | 
| IMUL     | IMUL      | ALOAD 0      | 
| ALOAD 2    | ALOAD 0     | GETFIELD String.hash : I  | 
| ILOAD 3    | GETFIELD String.value : [C | IMUL       | 
| CALOAD    | ILOAD 2     | ALOAD 0      | 
| IADD     | CALOAD      | GETFIELD String.value : [C | 
| ISTORE 1    | IADD      | ILOAD 1      | 
|      | ISTORE 1     | CALOAD      | 
|      |       | IADD       | 
|      |       | PUTFIELD String.hash : I  | 
+----------------------+----------------------------+------------------------------+ 
+0

これは、ローカルの値が複数回使用されている場合にのみ該当します。この場合、この値は使用されません。実際に、ローカルに値をコピーすると、この特定のメソッドの場合、55バイトと53バイトのバイトコードが使用されます。 – davmac

+0

@davmacを指定した質問に追加するだけで、別の変数でコピーしているだけのデータのコピーはありません。 –

+0

@SumitSingh私が参照している_value_は、コピーされている_参照です。参照は最終的にはポインタとポインタで表されます。 「データのコピーはありません」と主張するのは誤りです。 – davmac

-1

パフォーマンスのためです。 thisによれば、ローカル変数へのアクセスは、インスタンス変数へのアクセスよりも(非常にわずかに)高速です。 Javaベースライブラリでは、このようなマイクロ最適化はもちろん良いことです。

関連する問題