gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:49:09 25 4
gpt4 key购买 nike

我最近刚刚完成了一个 android 项目,我已经完成了一些 ArrayList 的大量代码并对其进行了循环操作。我这里有两组循环示例。

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

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

}

for(SomeObject obj: object){

}

如果您不需要递增值,我认为第二个很好,并且我认为比第一个更具可读性和简洁性。但是,在速度、性能和内存使用方面,这两个循环中的哪个是理想的或有效的?

最佳答案

根据建议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() (因此,结果看起来与数组文档中描述的结果类似)。

关于java - ArrayList for 循环最有效的实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com