ArrayList的for循环最有效的实现是什么?

时间:2013-02-24 06:55:12

标签: java android arraylist

我刚刚完成了一个android项目,我已经做了一些广泛的ArrayList代码并在其上做循环的东西。我这里有两套循环示例。

ArrayList<SomeObject> object = new ArrayList<SomeObject>();

for(int c=0;c<object.size();c++){

}

for(SomeObject obj: object){

}

我认为第二个是好的,如果你不需要增量值,我认为比第一个更可读和整洁。但是在速度,性能和内存使用方面,两个循环中的哪些是理想的或有效的?

1 个答案:

答案 0 :(得分:1)

根据建议from the Android Documentation,制作循环的最有效方法是:

public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}

请注意,这些方式对于使用JIT的设备具有相同的性能。因此,在JIT关闭的情况下(例如在使用Eclipse进行调试时)您可能会观察到不同的结果(two()将比one()更快)

<强>更新
我还使用以下代码检查了ArrayLists:

    final ArrayList<String> testArrayList = new ArrayList<String>(1000);

    for (int i = 0; i < 1000; i++) {
        testArrayList.add(String.valueOf(i<<2));
    }

    final TimingLogger timings = new TimingLogger("Loop", "ArrayLists");

    timings.addSplit("start");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;

        for (int i = 0; i < testArrayList.size(); i++) {
            sum += Integer.valueOf(testArrayList.get(i));
        }
    }

    timings.addSplit("zero()");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;
        final int len = testArrayList.size();

        for (int i = 0; i < len; i++) {
            sum += Integer.valueOf(testArrayList.get(i));
        }
    }

    timings.addSplit("one()");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;

        for (String item : testArrayList) {
            sum += Integer.valueOf(item);
        }
    }

    timings.addSplit("two()");
    timings.dumpToLog();

获得以下输出(使用JIT):

ArrayLists: begin
ArrayLists:      0 ms, start
ArrayLists:      2713 ms, zero()
ArrayLists:      1753 ms, one()
ArrayLists:      1922 ms, two()
ArrayLists: end, 6388 ms

因此,我们可以看到变体one()two()提供了类似的结果,这些结果比zero()更快(因此,结果看起来与文档中描述的类似)对于数组)。