Java 什么是ArrayList for循环的最有效实现?
我最近刚刚完成了一个android项目,我已经完成了ArrayList的一些扩展代码,并在上面做了一些循环工作。这里有两组循环示例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
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