これは、地元の人々に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 |
+----------------------+----------------------------+------------------------------+
不明ですが、メンバ変数は 'value.length'で引き続き使用されています。 –
@AndyTurner、それは答えですよね? 'hashCode'の実行中に' value'が変更された場合、 'ArrayIndexOutOfBoundsException'を取得するか、単に欠陥のあるハッシュコードを計算することができます。 – aioobe
@aioobe実行中に 'private final char [] value'がどのように変化し、その長さをチェックすると検出されるのでしょうか?そして、あなたは本当に 'val'の要素が変わることを期待しますか?' String'は不変です。 –