以下列表来自 2008 年名为“Dalvik Virtual Machine Internals”的谷歌 I/O 演讲,它列出了按效率从高到低依次循环一组对象的方法:
(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)很好?我认为这可能是(3)和(7)的数组和列表之间的区别。此外,正如 Dan 提到的 (7) 创建了大量必须进行 GC 处理的小型临时对象,我现在对 Java 有点生疏了,有人可以解释为什么吗?这是他在 0:41:10 的谈话视频中的一分钟。