0

コレクションを取得するための foreach 引数としてメソッド呼び出しを使用した場合のパフォーマンスについて疑問があります。例を見てみましょう:

for (Entry<K, V> entry : map.entrySet()) {
    doing.stuff();
}

JVM は、ループを開始する前に一度だけ map.entrySet() を呼び出し、最初の要素を取得し、イテレータを取得してそれを反復処理し、 map.entrySet() を二度と呼び出さないか、ローカルで作成された配列を反復処理するだけだと思いますintイテレータ(またはそのようなsth)ですが、JVMの仕組みがわからないので、確認したいのですが、このように機能しますか、またはループの前にコレクションを保存してローカル変数として渡す方が良いですループ内のゲッター?

4

2 に答える 2

6

Java 言語仕様から: 強化された for ステートメント:

強化された for ステートメントの形式は次のとおりです。

    for ( FormalParameter : Expression ) Statement

拡張された for ステートメントは、次の形式の基本的な for ステートメントと同等です。

    for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt TargetType Identifier =
            (TargetType) #i.next();
        Statement
    }

これに基づいて、コレクションは1 回map.entrySet()だけ取得されます。

于 2013-04-23T05:34:33.650 に答える
0
for(Object e : collection) {
}

と同等です

Iterator i = collection.iterator();
while(i.hasNext()) {
    Object e = i.next();
}

そのため、 Iterator オブジェクトの作成が含まれます。Iterator.next() に加えて、同時変更の追加チェックが含まれます。したがって、ArraListインデックスで要素にアクセスする方が効率的な場合があります

for(int i = 0; i < list.size(); i++) {
    Object e = list.get(i);
}
于 2013-04-23T05:49:18.453 に答える