Работа со списками в 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 разных вопроса.
- да в ArrayList есть переменная с размером. В конце-концов массив всегда знает свой размер. И именно его просто возвращает
list.size() - будет ли на каждой итерации заново получаться значение размера, т.е. будет ли каждый раз вызываться функция
list.size()?
Если в теле цикла не изменять размер массива, то ваши варианты одинаковы. В том смысле, что оптимизатор вероятнее всего закеширует значение, возвращаемоеlist.size()и не будет даже вызывать функцию на каждой итерации. И первый вариант будет одинаковым со вторым.
А если в теле цикла изменить массив, то работа первого варианта будет отличаться от второго. И проблемы можно получить при обоих вариантах.