28

私の質問は、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() は多くのことを行いますか?

4

1 に答える 1

56

最初の例でmap.values()は、一度評価されます。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 docsによると、これは遅くなります。ループ内でリストのサイズを変更していないと仮定すると、最も速い別の方法は、ループの前にリストのサイズを引き出すことです。

final int size = aList.size();
for (int i = 0; i < size; i++)
{
    object = aList.get(i);
    //do something with i
}

これは、aListたまたま. それはすべて、実装クラスの種類によって異なります。ArrayListLinkedListListaList

于 2012-04-18T20:35:22.480 に答える