以下哪项在 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);
}
我认为它们的意图都很清楚,所以我不认为风格/增加的复杂性是这里的问题。
直觉上看起来第一个会更好,因为只有一个“新”。但是,鉴于没有保留对映射的引用,HotSpot 是否能够确定为每个循环创建了相同大小的映射(内部的Entry[someNotSoLargeNumber]),然后使用相同的内存块(即不是做很多内存分配,只是归零可能比为每个循环调用 clear() 更快)?
一个可接受的答案是一个文档的链接,该文档描述了 HotSpot VM 可以实际执行的不同类型的优化,以及如何编写代码来辅助 HotSpot(而不是天真地尝试手动优化代码)。