【问题标题】:Quickest and most efficient way to traverse an ArrayList in reverse反向遍历 ArrayList 的最快和最有效的方法
【发布时间】:2011-09-05 12:43:50
【问题描述】:

有没有比使用ListIterator 更快、更有效的方法?

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

【问题讨论】:

  • 如果列表不是双链接的,从头到尾迭代会快得多...我假设情况并非如此。
  • 我假设您需要向后迭代。
  • @amit: 是一个数组列表,这里应该没有区别。

标签: java arraylist iteration micro-optimization


【解决方案1】:

根据ListListIterator 的实现,以下可能(稍微)更快。

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

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

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

几乎可以肯定,您在循环中所做的任何工作都会抵消不使用迭代器所获得的任何性能。

【讨论】:

  • +1 最后一个短语,这比使用Iterator 快多少?你能分享一个链接吗?
  • @Alberto,我只是假设迭代器可能会增加直接访问 List 可以避免的额外开销。但是,我不能百分百确定。这绝对是一个微优化的案例。
  • @Alberto,任何避免创建对象的方法通常都比创建对象的方法快。 (虽然差异可能很小)
  • @jjnguy,谢谢!我进行了计时测试,似乎使用迭代器与您建议的替代方案几乎没有区别。对我来说,使用迭代器使代码更具可读性。
  • @mre,我就是这么做的。
【解决方案2】:

理论上,使用简单的基于索引的 for 循环可能会更快一些,因为测试没有方法调用开销,但实际上这不太可能很重要,并且可能根本不会真正体现出来.

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

【讨论】:

  • 你在说什么测试?
  • @Alberto: hasPrevious() vs. i>= 0 - 当然必须创建迭代器对象本身。
【解决方案3】:

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

注意java.util.LinkedList 是一个链表,所以这个策略不是必须的;使用hasPreviousprevious 与前进方向一样有效。我认为,java.util 中的每个股票 List 实现都是如此。

【讨论】:

  • @mre,Ted 说对于列表的一些非常具体的实现,反转它可能会更快。
【解决方案4】:

您提出的解决方案与使用带有索引的常规 for 一样快。如果您想寻找更好的解决方案,我建议使用 LinkedList 实现,因为我认为这是可用的最快解决方案。

【讨论】:

    【解决方案5】:

    你可以反转一行是

    Collections.reverse(list);

    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]
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2017-02-03
      • 2021-11-07
      • 1970-01-01
      • 2012-09-12
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多