6

この記事から、

手書きのカウントループは約 3 倍高速です

配列リストを反復するための強化された for ループよりも。

まず、「手書きのカウントループ」とはどういう意味ですか?彼らは、これが何を意味するのかを明確に説明していません。第二に、これが配列リストにのみ当てはまり、他のコレクションには当てはまらないのはなぜですか?

4

4 に答える 4

7

まず、「手書きのカウントループ」とはどういう意味ですか?

私は彼らが意味すると思います

for(int i=0;i<list.size();i++) {
    list.get(i);
}

第二に、これが配列リストにのみ当てはまり、他のコレクションには当てはまらないのはなぜですか?

ArrayList は効率的なランダム アクセスをサポートしており、Iterator を削除すると小さな改善が得られます。(または、他に何もしないループがある場合は、相対的に大幅に改善されます)

LinkedList などの他のコレクションの場合、Iterator を使用する方get(n)が遅いため、高速です。セットの場合はありませんget(n)

于 2012-04-11T20:11:25.100 に答える
5

この質問に対する答えはすべて (私がこれを書いている時点では 3 つの答えがあります)、間違っています。

Android では、手書きのループに対してこれを行うべきではありません。

for(int i=0;i<list.size();i++) {
    list.get(i);
}

上記は間違っています。

ループは次のようになります (サイズは一時的に独自の変数にコピーされます)。

int size = list.size();
for(int i=0;i<size;i++) {
    list.get(i);
}

そうしないと、ループの反復ごとにルックアップ ペナルティが発生します。質問からリンクされた記事を注意深く読むと、Google もこのパターンを推奨していることがわかります。

于 2013-06-10T07:25:59.660 に答える
0

手書きのカウント ループは、同じ記事内zero()またはone()同じ記事内のループのように見えます。

List<Foo> foos = new ArrayList<Foo>();
// populate the list...

for (int i=0; i<foos.size(); i++) {
    Foo foo = foos.get(i);
    // do something with foo
}
于 2012-04-11T20:09:45.623 に答える
0

手書きのカウントループです。つまり、配列内の各要素をカウントするループを手動で作成したということです。

for (int i = 0; i < mArray.length; ++i) {

これは、基礎となる実装が与えられた配列リストにも当てはまります。強化された for ループは汎用的に機能する必要があるため、特定のことを想定できません。インデックスの開始点と終了点など。

于 2012-04-11T20:10:46.450 に答える