以最快和最有效的方式反向遍历ArrayList

时间:2011-05-31 13:55:53

标签: java arraylist iteration micro-optimization

与使用ListIterator相比,是否有更快,更有效的方法?

ListIterator<Integer> itr = list.listIterator(list.size());
while(itr.hasPrevious()){
    System.out.println(itr.previous());
}

5 个答案:

答案 0 :(得分:10)

根据ListListIterator的实施情况,以下内容可能会(稍微)更快。

List l;
for (int i = l.size()-1; i >=0; i--) {
    System.out.println(l.get(i));
}

对于ArrayList,这可能会更快,但LinkedList几乎肯定会更慢。

最好的办法就是使用迭代器。

几乎可以肯定,无论你在循环中做什么工作都会否定不使用迭代器所获得的任何性能。

答案 1 :(得分:2)

理论上,使用一个简单的基于索引的for循环可能会更快一点,因为测试没有方法调用开销,但实际上这非常非常不可能是重要的,并且可能实际上根本没有显示

更重要的是,基于迭代器的解决方案更清晰,并且能够有效地处理链表,而不仅仅是ArrayLists

答案 2 :(得分:2)

根据列表的实现类,反转列表(使用Collections.reverse),使用转发迭代器,然后再次反转列表以恢复它可能更有效。

请注意,java.util.LinkedList链接列表,因此不需要此策略;使用hasPreviousprevious与前进方向一样有效。我认为,对于java.util中的每个库存List实现都是如此。

答案 3 :(得分:1)

您提供的解决方案与使用带索引的常规for一样快。如果您希望搜索更好的解决方案,我建议使用LinkedList实现,因为我认为这是最快的解决方案。

答案 4 :(得分:0)

你可以反转一行

<强> Collections.reverse(列表);

ArrayList arrayList = new ArrayList();

arrayList.add("A");
arrayList.add("B");

System.out.println("Before Reverse Order : " + arrayList);

Collections.reverse(arrayList);

System.out.println("After Reverse : " + arrayList);

<强>输出

Before Reverse Order : [A, B]
After Reverse : [B, A]