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

Java 什么是ArrayList for循环的最有效实现?,java,android,arraylist,Java,Android,Arraylist,我最近刚刚完成了一个android项目,我已经完成了ArrayList的一些扩展代码,并在上面做了一些循环工作。这里有两组循环示例 ArrayList<SomeObject> object = new ArrayList<SomeObject>(); for(int c=0;c<object.size();c++){ } for(SomeObject obj: object){ } ArrayList对象=新建ArrayList(); 对于(int c=0

我最近刚刚完成了一个android项目,我已经完成了ArrayList的一些扩展代码,并在上面做了一些循环工作。这里有两组循环示例

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

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

}

for(SomeObject obj: object){

}
ArrayList对象=新建ArrayList();
对于(int c=0;c,根据建议,形成循环的最有效方法是:

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):


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

您试图猜出JVM,这只不过是一场失败的游戏。所以不要这样做。请在继续之前阅读本文。Dalvik优化可能与其他JVM不同,因此Android在可读性方面优于有问题的性能增益。JVM比您认为的更聪明:)你应该首先分析它。问题不是关于数组,而是关于ArrayList。不相关。您认为数组与ArrayList不相关,或者在循环中使用时有显著的性能差异吗?用我对ArrayList的测量更新了答案。谢谢@Sanderstar。你是在eclipse中这样做的吗?JIT是eclipse中的一个插件吗?我已经在eclipse中创建了一个项目来分析它。JIT不是eclipse的一部分,请在这里查看对它的一些简要描述。
    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();
ArrayLists: begin
ArrayLists:      0 ms, start
ArrayLists:      2713 ms, zero()
ArrayLists:      1753 ms, one()
ArrayLists:      1922 ms, two()
ArrayLists: end, 6388 ms