Java での最善の方法は次のようになります。
for (Integer i : calc.subList(start, calc.size()) {
...
}
subList
は、元のリストの効率的なビューであるため、ほぼ正確に必要なものです。
アップデート
わかりました、ミケラのコメントに動機付けられて、私はそれをベンチマークしました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
結論:
メイン リストの拡張は、初期化コストを超えると、インデックス付き反復と同じくらい高速です。
サブリストのトラバーサルはメイン リストのトラバーサルよりもやや遅く、反復はインデックス付きトラバーサルよりもやや遅くなります。
すべての実用的な目的において、すべての違いは無視できます。