El método Collections.reverse en realidad devuelve una nueva lista con los elementos de la lista original copiados en orden inverso, por lo que tiene un rendimiento O (n) con respecto al tamaño de la lista original.
Como una solución más eficiente, podría escribir un decorador que presente una vista inversa de una Lista como Iterable. El iterador devuelto por su decorador usaría el ListIterator de la lista decorada para recorrer los elementos en orden inverso.
Por ejemplo:
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);
}
}
Y lo usarías como:
import static Reversed.reversed;
...
List<String> someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
doSomethingWith(s);
}