Работа со списками в Java

При вызове метода .size() у ArrayList мы даём команду пересчитать размер списка или просто считываем из памяти "служебную" переменную, которая хранит размер списка?

Предположим, имеется список из 1_000_000 очень больших строк. Будет ли разница в скорости работы между двумя реализациями?

Первый вариант:

for (int i = 0; i < list.size(); i++) {...}

Второй вариант:

int k = list.size();
for (int i = 0; i < k; i++) {...}

Ответы (2 шт):

Автор решения: Алексей Р

У класса ArrayList есть свойство private int size, которое содержит длину списка. Метод

public int size() {
        return size;
    }

возвращает значение этого свойства. Т.е. ответ такой - при запросе длины списка он не пересчитывается (по сути - "просто считываем из памяти "служебную" переменную", как вы написали).

→ Ссылка
Автор решения: DmitryK

У вас 2 разных вопроса.

  1. да в ArrayList есть переменная с размером. В конце-концов массив всегда знает свой размер. И именно его просто возвращает list.size()
  2. будет ли на каждой итерации заново получаться значение размера, т.е. будет ли каждый раз вызываться функция list.size()?
    Если в теле цикла не изменять размер массива, то ваши варианты одинаковы. В том смысле, что оптимизатор вероятнее всего закеширует значение, возвращаемое list.size() и не будет даже вызывать функцию на каждой итерации. И первый вариант будет одинаковым со вторым.
    А если в теле цикла изменить массив, то работа первого варианта будет отличаться от второго. И проблемы можно получить при обоих вариантах.
→ Ссылка