2016-03-07 160 views
3

我在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); 
} 

它与效率有关吗?通过我自己的逻辑,上面的例子比输入一个类更有效率。

+0

注意'allNums + ='会使用'StringBuilder'得到更好的实现 - 但是这有点正交的问题。 –

+0

你可能想看看http://stackoverflow.com/questions/1879255/performance-of-traditional-for-loop-vs-iterator-foreach-in-java – ctst

回答

1

一种像下面的循环基本上是被设计为遍历集合相当期待迭代器。

这其实并不重要,除非你正在做的,你需要删除元素其他的事情,有能力通过hasNext()

在列表中向前移动 next()或向后 previous(),并检查了更多的元素的能力

TL:DR 其更好地使用forEach循环,如果你只是想遍历Collection。否则,使用迭代器。

1

尝试使用for循环并在循环时删除某些元素:-)您将获得相当的例外ConcurrentModificationException,这就是为什么使用Iterator接口是安全的,并且可能会在这种情况下使用。我认为这可能是NetBeans建议您使用Iterator的原因。

0

增强的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会建议使用明确的迭代器形式来代表您在问题中提供的代码,这似乎令人惊讶 - 虽然语言特性的存在并不一定意味着它是一个好主意,但我不能看到什么优势不是使用它会在这种情况下给。