Метод Collections.reverse фактично повертає новий список з елементами оригінального списку, скопійованими в нього у зворотному порядку, тому це має O (n) продуктивність щодо розміру вихідного списку.
Як більш ефективне рішення, ви можете написати декоратор, який представляє зворотний вигляд Списку як Ітерабельного. Ітератор, повернений вашим декоратором, використовує ListIterator оформленого списку для переходу по елементах у зворотному порядку.
Наприклад:
public class Reversed<T> implements Iterable<T> {
private final List<T> original;
public Reversed(List<T> original) {
this.original = original;
}
public Iterator<T> iterator() {
final ListIterator<T> i = original.listIterator(original.size());
return new Iterator<T>() {
public boolean hasNext() { return i.hasPrevious(); }
public T next() { return i.previous(); }
public void remove() { i.remove(); }
};
}
public static <T> Reversed<T> reversed(List<T> original) {
return new Reversed<T>(original);
}
}
І ви б використовували це так:
import static Reversed.reversed;
...
List<String> someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
doSomethingWith(s);
}