私の質問は、Android コンパイラを使用した Java の最適化に関するものです。次の map.values() は反復ごとに呼び出されるのでしょうか、それとも Android コンパイラによって最適化されるのでしょうか。
LinkedHashMap<String, Object> map;
for (Object object : map.values())
{
//do something with object
}
同様に、別の例を示します。aList.size() は反復ごとに呼び出されますか?
List<Object> aList;
for (int i = 0; i < aList.size(); i++)
{
object = aList.get(i);
//do something with i
}
そして、結局のところ、反復ごとにメソッドを呼び出すことは本当に重要なのでしょうか? Map.values() と List.size() は何か意味があるのでしょうか?
ベストアンサー1
最初の例では、map.values()
は1回評価されます。Java言語仕様のセクション14.4.2は以下と同等です:
for (Iterator<Object> i = map.values().iterator(); i.hasNext(); ) {
Object object = i.next();
// do something with object
}
2 番目では、aList.size()
テストが評価されるたびに が呼び出されます。読みやすさのために、次のようにコーディングする方がよいでしょう。
for (Object object : aList) {
// do something with object
}
しかし、Androidのドキュメントによると(私が見つけたページはもう利用できませんが、ここにアーカイブ) これは遅くなります。ループ内でリストのサイズを変更していないと仮定すると、
最も速い
別の方法は、ループの前にリストのサイズを取り出すことです。
final int size = aList.size();
for (int i = 0; i < size; i++)
{
object = aList.get(i);
//do something with i
}
が の場合、これは大幅に高速化されます (上記リンク先の Android ドキュメントでは 3 倍とされています)。ただし、aList
のArrayList
場合は遅くなる可能性があります (大幅に遅くなる可能性もあります) LinkedList
。これは、List
実装クラスがどのような種類でaList
あるかによって決まります。