Ниже приведен список разговоров ввода-вывода google в 2008 году под названием "Внутренние виртуальные машины Dalvik", в котором перечислены способы циклического перехода по множеству объектов в порядке от наименее эффективного:
(1) for (int i = initializer; i >=0; i--) //hard to loop backwards
(2) int limit = calculate_limit(); for (int i= 0; i< limit; i++)
(3) Type[] array = get_array(); for (Type obj : array)
(4) for (int i =0; i< array.length; i++) //gets array.length everytime
(5) for (int i=0; i < this.var; i++) //has to calculate what this.var is
(6) for (int i=0; i < obj.size(); i++) //even worse calls function each time
(7) Iterable list = get_list(); for (Type obj : list) //generic object based iterators slow!
Первые 3 находятся на одной и той же территории эффективности, избегайте 7, если это возможно. Это, в основном, советы по использованию аккумулятора, но потенциально может помочь и Java-код SE.
Мой вопрос: почему (7) медленный и почему (3) хорошо? Я думал, что это может быть разница между Array и List for (3) и (7). Кроме того, как отметил Дэн (7), создается множество небольших временных объектов, которые должны быть GCed, в настоящее время я немного ржавый на Java, может кто-нибудь объяснить, почему? Это в его talk video в 0:41:10 в течение минуты.