Efficiency is unlikely to be significant - of course, it is System.out.printlnmuch more likely to be a bottleneck in your specific example.
The second approach (improved for the loop) is the most readable one. Note that the three approaches do not do the same: the first one will iterate from the end, not from the beginning. Getting the right behavior almost always surpasses a tiny, tiny cue ball faster. The more readable your code is, the more likely it is that you will fix it.
, , , - ( ).
EDIT: , ArrayList<T>.
List<T>, . List<T> . , get, , . , , . , List<T>.
: , , . , , , . ( , , .) , , ... .
, , , RandomAccess.