增强了循环开始部分通过List

时间:2013-06-25 16:02:10

标签: java list for-loop

我是Java的初学者,我有这个疑问。是否可以在ArrayList上使用Java中的Enhanced for循环,但是从指定的点而不是ArrayList [0]开始。

For eg. ArrayList<Integer> calc = new ArrayList<Integer>;
       // calc contains {0,1,2,3,4,5,6,7}

我可以使用增强型for循环并从calc [2]而不是calc [0]开始迭代吗?如果可能的话,我该怎么做? 在我的特定情况下,使用增强的for循环会更好,而不是正常的for循环。

5 个答案:

答案 0 :(得分:16)

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

结论:

    主列表中
  1. 的增强与索引迭代一样快,一旦超过初始化成本;

  2. 子列表的遍历有点比主列表慢,并且迭代在某种程度上比索引遍历慢;

  3. 所有差异在所有实际目的中都可以忽略不计。

答案 1 :(得分:5)

你在这里使用传统的循环... ...

for (int i = 2; i < calc.size(); i++) {
    Integer x = calc.get(i);
}

好吧,除非你愿意为了使用增强的for循环而创建一个临时的subList,这很好,因为子列表是原始列表的视图,并且不创建新的列表对象: / p>

for (Integer x : calc.subList(2, calc.size())) {

}

答案 2 :(得分:3)

for(Item e : list.subList(1, list.size())) {
    // ...
}

答案 3 :(得分:1)

您可以遍历sublist,如下所示:

for (Integer integerMember : calc.subList(2, calc.size()) {
    // operation here
}

答案 4 :(得分:0)

应该注意的是,增强的for循环对ArrayList然后标准索引的效率较低。这是因为我们必须在循环的每一步创建一个Iterator对象并在其上调用hasNextnext,从而导致不必要的开销。

出于这个原因,我建议使用传统方式编制索引,而不是使用sublist方法。