オートボクシングは を使用します。これはInteger.valueOf
、小さい整数の Integer オブジェクトを内部的にキャッシュします (デフォルトでは -128 から 127 ですが、最大値は「java.lang.Integer.IntegerCache.high」プロパティで構成できます - Integer.valueOf のソース コードを参照してください)。ですので、new Integer
直接呼び出すのとは異なります。Integer.valueOf
は を呼び出す前に整数値の大きさをすばやくチェックするため、直接new Integer
呼び出す方が少し高速new Integer
です (小さな整数がたくさんある場合は、より多くのメモリを使用します)。Java での割り当ては非常に高速であり、GC を実行する時間はライブの短命オブジェクトの数に比例する (つまり、ガベージの量には比例しない) ため、GC も非常に高速です。
ただし、JVM のバージョンと有効になっている最適化によっては、スカラー置換の最適化があり、有効期間の短いオブジェクトを割り当てるときに、はるかに大きなパフォーマンスの違いが生じる可能性があります (この例では、保存しているため、最適化を行うことができません)。マップ内のオブジェクトですが、他の多くの状況で役立ちます)。
最近の JVM バージョンでは、スカラー置換の最適化があります (エスケープ解析が一時的に無効になっている 1.6.0_18 を除く)。つまり、存続期間の短いオブジェクトの割り当てを最適化して取り除くことができます。JVM のスカラー置換が新しくなったとき、誰かがあなたのコードに似たベンチマークを作成しました。その結果、プリミティブを使用したコードが最も速く、明示的なnew Integer()
呼び出しを含むコードはプリミティブを使用したコードとほぼ同じ速さで、オートボクシングを使用したコードははるかに遅くなりました。これは、オートボクシングの使用Integer.valueOf
と、少なくとも当時のスカラー置換の最適化では、その特別なケースが考慮されていなかったためです。それ以来、最適化が改善されたかどうかはわかりません。