7

我是Java的初学者,我有这个疑问。是否可以在 ArrayList 上使用 Java 中的增强 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 循环。

4

5 回答 5

18

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

结论:

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

  2. 子列表的遍历主列表慢一些,迭代索引遍历慢一些;

  3. 对于所有实际目的,所有差异都可以忽略不计。

于 2013-06-25T16:06:06.280 回答
5

你在这里使用传统的循环被困住了......

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

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

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

}
于 2013-06-25T16:05:36.720 回答
3
for(Item e : list.subList(1, list.size())) {
    // ...
}
于 2013-06-25T16:05:30.577 回答
1

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

for (Integer integerMember : calc.subList(2, calc.size()) {
    // operation here
}
于 2013-06-25T16:07:49.027 回答
0

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

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

于 2013-06-25T16:34:50.017 回答