Самый быстрый и эффективный способ прохождения ArrayList в обратном направлении

есть ли более быстрые и эффективные средства для этого, чем использование ListIterator?

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

5 ответов


в зависимости от реализации List и ListIterator следующее Может быть (немного) быстрее.

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

Это может быть быстрее для ArrayList но это почти наверняка будет медленнее на LinkedList.

лучше всего использовать итератор.

почти наверняка любая работа, которую вы делаете в цикле, отрицает любую производительность, полученную без использования итератора.


теоретически использование простого цикла на основе индекса for может быть быстрее на минимальную сумму, поскольку для теста нет накладных расходов на вызов метода, но на практике это очень, очень маловероятно, что это будет значительным и может вообще не проявляться.

гораздо важнее, чтобы решение на основе итератора было более ясным и эффективно работало со связанными списками, а не только с ArrayLists


в зависимости от класса реализации списка, может быть более эффективным отменить список (используя Collections.reverse), используйте прямой итератор, а затем снова переверните список, чтобы восстановить его.

отметим, что java.util.LinkedList это двойной-связанный список, поэтому эта стратегия не нужна; используя hasPrevious и previous так же эффективно, как идти в прямом направлении. Это верно, я думаю, для каждой реализации списка запасов в java.утиль.


решение, которое вы представили, так же быстро, как использование регулярного for с индексом. Если вы хотите найти еще лучшее решение, я предлагаю реализацию с LinkedList, поскольку я думаю, что это самое быстрое решение.


вы можете изменить на одну строку, которая

сборники.реверс (список);

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]