Javaのforeachとforループのメソッド 質問する

Javaのforeachとforループのメソッド 質問する

私の質問は、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 倍とされています)。ただし、aListArrayList場合は遅くなる可能性があります (大幅に遅くなる可能性もあります) LinkedList。これは、List実装クラスがどのような種類でaListあるかによって決まります。

おすすめ記事