3

アプリケーションは巨大なアプリケーションであるため、アプリケーションのプロファイリングに使用JProfilerしていました。そのため、そのパフォーマンスと効率を非常によく認識しています。
時間がかかりすぎたため、すべてIterator.hasNextをに置き換えfor-eachましたが、JProfilers CPUビューに表示されている場合、Iterator.hasNext使用している場所と呼ばれるメソッドが表示されfor-eachます。
なぜそうするのですか?これら2つの間に何か関係はありますか?サンプルコードは次のとおりです。

    List<Map<String, Object>> mapList = jdbcTemplate
                        .queryForList(MAP.SELECT_ALL);
                for (Map<String, Object> map : mapList) {
            list.add(fillPreferenceMaster(preferenceMasterMap));
}
4

3 に答える 3

10

はい、拡張forステートメントはIterator反復可能なコレクションにアンダーザカバーを使用します。JLSのセクション14.14.2を参照してください。

式のタイプがのサブタイプである場合、Iをのタイプとします。拡張ステートメントは、次の形式の基本ステートメントと同等です。Iterable.iterator()forfor

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

拡張ステートメントが発生する#i時点でスコープ(§6.3)にある他の識別子(コンパイラー生成またはその他)とは異なるコンパイラー生成識別子はどこにありますか。for

于 2012-02-20T06:00:29.643 に答える
2

Javaのfor-eachループは、基盤となるイテレータメカニズムを使用します。したがって、あなたの質問に答えるために、コードは同じです。

これは、コードのボトルネックではない可能性があります。JProfilerを使用して上位10のメソッドホットスポットを特定し、それらのメソッド呼び出しを最適化する方法を見つける必要があります。

于 2012-02-20T06:03:32.827 に答える
0

for-eachステートメントは、イテレーターを使用してコレクションを反復処理します。コンパイラは、for-eachをwhileループに置き換えます。

于 2012-02-20T06:01:21.093 に答える