我刚刚完成了一个android项目,我已经做了一些广泛的ArrayList代码并在其上做循环的东西。我这里有两套循环示例。
ArrayList<SomeObject> object = new ArrayList<SomeObject>();
for(int c=0;c<object.size();c++){
}
for(SomeObject obj: object){
}
我认为第二个是好的,如果你不需要增量值,我认为比第一个更可读和整洁。但是在速度,性能和内存使用方面,两个循环中的哪些是理想的或有效的?
答案 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()
更快(因此,结果看起来与文档中描述的类似)对于数组)。