2016-03-07 243 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會建議使用明確的迭代器形式來代表您在問題中提供的代碼,這似乎令人驚訝 - 雖然語言特性的存在並不一定意味着它是一個好主意,但我不能看到什麼優勢不是使用它會在這種情況下給。