for循环或迭代器?
问题描述:
我在Netbeans的工作,它一直建议我使用一个迭代器,而不是一个-in循环。上次我遇到它是用这个位:for循环或迭代器?
ArrayList<String> numString = new ArrayList<>();
ArrayList<Integer> nums = new ArrayList<>();
String allNums = "";
nums.add(1);
nums.add(2);
nums.add(9);
for(int num : nums) {
allNums += String.valueOf(num);
}
numString.add(allNums);
for(String num : numString) {
System.out.println(num);
}
它与效率有关吗?通过我自己的逻辑,上面的例子比输入一个类更有效率。
答
一种像下面的循环基本上是被设计为遍历集合相当期待迭代器。
这其实并不重要,除非你正在做的,你需要删除元素其他的事情,有能力通过hasNext()
next()
或向后
previous()
,并检查了更多的元素的能力
TL:DR 其更好地使用forEach
循环,如果你只是想遍历Collection
。否则,使用迭代器。
答
尝试使用for循环并在循环时删除某些元素:-)您将获得相当的例外ConcurrentModificationException
,这就是为什么使用Iterator
接口是安全的,并且可能会在这种情况下使用。我认为这可能是NetBeans建议您使用Iterator
的原因。
答
增强的for语句语法糖,使其更好的通过一个Iterable
迭代。谈到JLS:
增强的for语句的形式:
EnhancedForStatement: for (FormalParameter : Expression) Statement
...
增强的for语句等价于一个基本的申请表格的声明:
for (I #i = Expression.iterator(); #i.hasNext();) { VariableModifiersopt TargetType Identifier = (TargetType) #i.next(); Statement }
所以写的语句c。将增强注释比使用显式迭代器更有效率,因为它是使用迭代器实现的。
Netbeans会建议使用明确的迭代器形式来代表您在问题中提供的代码,这似乎令人惊讶 - 虽然语言特性的存在并不一定意味着它是一个好主意,但我不能看到什么优势不是使用它会在这种情况下给。
注意'allNums + ='会使用'StringBuilder'得到更好的实现 - 但是这有点正交的问题。 –
你可能想看看http://stackoverflow.com/questions/1879255/performance-of-traditional-for-loop-vs-iterator-foreach-in-java – ctst