considering this example:
public static void main(final String[] args) {
final List myList = Arrays.asList(\"A\", \"B\", \"C\", \"D\");
It makes sense that the second implementation is faster, because you store a single, final, local copy of the variable. The compiler would have to figure out that the size can't change inside the loop in order for the performance to be roughly equivalent.
One question is -- does this kind of micro-optimization really matter? If it does, go with what is running faster in your tests and doesn't rely on a compiler optimization.