次のうち、Java 6 HotSpot VM でより最適なのはどれですか?
final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);
for (int i = 0; i < someLargeNumber; i++)
{
doSomethingWithMap(map);
map.clear();
}
また
final int someNotSoLargeNumber = ...;
for (int i = 0; i < someLargeNumber; i++)
{
final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);
doSomethingWithMap(map);
}
どちらも意図がはっきりしていると思うので、ここではスタイルや追加された複雑さが問題になるとは思いません。
直観的には、'new' は 1 つしかないので、最初のほうが良いように見えます。ただし、マップへの参照が保持されていない場合、HotSpot はループごとに同じサイズ (内部では Entry[someNotSoLargeNumber]) のマップが作成されていると判断し、同じメモリ ブロックを使用します (つまり、そうではありません)。ループごとに clear() を呼び出すよりも速いかもしれないゼロ化だけで、多くのメモリ割り当てを行いますか?
受け入れられる答えは、HotSpot VM が実際に実行できるさまざまなタイプの最適化、および HotSpot を支援するコードの記述方法を説明するドキュメントへのリンクです (手作業でコードを最適化する単純な試みではなく)。