使用for循环还是for-each循环?
我们应该更喜欢for-each循环而不是传统的for循环吗? while循环是否有利?
List names = Arrays.asList("John", "Jeff", "Mary", "Elise"); //for-each loop for(String name: names){ log(name); } //traditional for-loop for(int index=0; index < 10; ++index){ log(names.get(index)); } //Iterator while Iterator iter1 = names.iterator(); while (iter1.hasNext()) { log(iter1.next()); } //Iterator for loop for(Iterator iter2 = names.iterator(); iter2.hasNext();){ log(iter2.next()); }
什么是最好的味道?
是一样的。 但有些情况比其他情况更有利
情况1:
//for-each loop for(String name: names){ log(name); }
有利的:
- 当你想迭代收集
- 没有添加或删除数组。
- 不需要迭代的项目索引
案例2:
//traditional for-loop for(int index=0; index < 10; ++index){ log(names.get(index)); }
有利的:
- 当你想迭代收集
- 你需要处理你迭代的项目的索引。 因此,您始终拥有当前索引的价值。
案例3:
Iterator iter1 = names.iterator(); while (iter1.hasNext()) { log(iter1.next()); }
和
//Iterator for loop for(Iterator iter2 = names.iterator(); iter2.hasNext();){ log(iter2.next()); }
有利的:
- 当你想迭代收集
- 迭代时加法或删除。
循环1,3和4基本相同,可能编译为相同的字节码。 所以使用第一个更易读的。
如果您不知道要处理的列表实现,应该避免使用循环2。 特别地, list.get(i)
可以是某些列表上的O(n)操作(例如LinkedLists),使得循环2的性能为O(n ^ 2)操作=坏。
选项1只是3和4的缩短版本。其中#1是优选的,因为它更容易编写和读取。 选项2在微观性能方面可能更好,因为它不会创建Iterator对象,但仅在您使用像ArrayList这样的RandomAccess列表的情况下
如果要删除此循环中的某些元素,请不要使用foreach
循环。 相反,使用经典的for
循环,当你从集合中删除元素后可以减少迭代器。
因为和foreach在性能上略有不同。 它们的速度大致相同。 但是foreach循环使用更多的堆栈空间用于局部变量。
有关此问题的更多详情,请参阅
http://forums.asp.net/t/1209455.aspx/1
只要容器实现Iterable,就可以使用for each
,只要上面提到你就不需要索引。 Altought概率地,您将使用Objects id字段而不是id。