我是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循环。
答案 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 :(得分: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
对象并在其上调用hasNext
和next
,从而导致不必要的开销。
出于这个原因,我建议使用传统方式编制索引,而不是使用sublist
方法。