Методы в foreach и для циклов в java - программирование
Подтвердить что ты не робот

Методы в 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() что-нибудь?

4b9b3361

Ответ 1

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

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 окажется ArrayList, но скорее всего будет медленнее (возможно, много) для LinkedList. Все зависит от того, какой тип класса List aList есть.