Java中最好的方法是这样的:
for (Integer i : calc.subList(start, calc.size()) {
...
}
subList
是原始列表的有效视图,因此它几乎正是您所需要的。
更新
好的,受 Mikera 评论的启发,我将其作为基准jmh
。这是基准代码:
import org.openjdk.jmh.annotations.GenerateMicroBenchmark;
public class Benchmark1
{
static final List<Integer> list = new ArrayList(asList(1,2,3,4,5,6,7,8,9,10));
static { for (int i = 0; i < 5; i++) list.addAll(list); }
@GenerateMicroBenchmark
public long testIterator() {
long sum = 0;
for (int i : list) sum += i;
return sum;
}
@GenerateMicroBenchmark
public long testIndexed() {
long sum = 0;
for (int i = 0; i < list.size(); i++) sum += list.get(i);
return sum;
}
@GenerateMicroBenchmark
public long testSublistIterator() {
long sum = 0;
for (int i : list.subList(1, list.size())) sum += i;
return sum;
}
@GenerateMicroBenchmark
public long testIndexedSublist() {
long sum = 0;
final List<Integer> l = list.subList(1, list.size());
for (int i = 0; i < l.size(); i++) sum += l.get(i);
return sum;
}
}
这些是结果:
Benchmark ops/msec
-------------------------
Indexed 1860.982
IndexedSublist 1642.059
Iterator 1818.657
SublistIterator 1496.994
结论:
主列表上的增强 for与索引迭代一样快,一旦超过初始化成本;
子列表的遍历比主列表慢一些,迭代比索引遍历慢一些;
对于所有实际目的,所有差异都可以忽略不计。