Методы в foreach и для циклов в java

Мой вопрос касается оптимизации в java с помощью компилятора Android. Будет ли отображаться map.values ​​() следующим образом каждой итерации, или компилятор Android оптимизирует ее.

LinkedHashMap<String, Object> map; for (Object object : map.values()) { //do something with object } 

Аналогичным образом это еще один пример. Будет ли aList.size () называться каждой итерацией?

 List<Object> aList; for (int i = 0; i < aList.size(); i++) { object = aList.get(i); //do something with i } 

И после всего этого, действительно ли имеет значение, если он называет методы каждой итерацией? Делают ли Map.values ​​() и List.size () что-то еще?

Solutions Collecting From Web of "Методы в foreach и для циклов в java"

В первом примере map.values() будет оцениваться один раз. Согласно разделу 14.4.2 Спецификации языка Java , это эквивалентно:

 for (Iterator<Object> i = map.values().iterator(); i.hasNext(); ) { Object object = i.next(); // do something with object } 

Во втором, aList.size() будет вызываться каждый раз, когда тест оценивается. Для удобства чтения было бы лучше записать его как:

 for (Object object : aList) { // do something with object } 

Однако, для Android-документов это будет медленнее. Предполагая, что вы не меняете размер списка внутри цикла, самым быстрым способом будет вывести размер списка перед циклом:

 final int size = aList.size(); for (int i = 0; i < size; i++) { object = aList.get(i); //do something with i } 

Это будет значительно быстрее (документы Android, связанные с выше, говорят в 3 aList ), если aList оказывается ArrayList , но, скорее всего, будет медленнее (возможно, много) для LinkedList . Все зависит от того, какой именно класс List aList .