2011-12-07 39 views
5

我有一個列表:名單VS列表迭代器

List<Object> myList = new ArrayList<Object>(); 

要從此列表中獲取有兩種方法:

1.

for(Object obj : myList) 
{ 
    // some code 
} 

2.

Iterator<Object> objIt = myList.iterator(); 
while(obj.hasNext()) { 
    Object obj = (Object)objIt.next(); 
    // some code 
} 

我的問題是哪一個是內存有效率和迭代速度快?

+0

你說的「爲了得到那個」到底意味着什麼? –

+1

http://stackoverflow.com/questions/2113216/which-is-more-efficient-a-for-each-loop-or-an-iterator –

+0

請在提問之前使用搜索。 Stack Overflow已經提出並回答了很多問題。重複:http://stackoverflow.com/questions/2113216/which-is-more-efficient-a-for-each-loop-or-an-iterator –

回答

12

他們做同樣的事情 - 增強的for循環只是對於longhand版本的語法糖(對於iterables;對於數組來說略有不同)。除非你明確需要迭代器(例如調用remove()),否則我會使用第一個版本。

有關編譯器執行的確切轉換的更多詳細信息,請參閱section 14.14.2 of the Java Language Specification

+1

我正要給出類似的答案。 (除了第14 ...部分)+1速度。 –

+0

Iterable接口(http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html)說這是爲增強型循環而設計的。只是想指出他們完全一樣的參考。 – pimaster

2

第一個就是你所謂的「增強的for循環」,這是在JDK 1.5 +

引入的。它是通過迭代列表更便捷的方式。另外,如果您使用的是,則不需要進行明確的轉換。

從性能角度來看,我認爲兩者沒有太大的區別。

1

增強for循環使用的迭代器只在它內部。所以兩者都是一樣的。

1

第一個更清晰,但如果你想在訪問列表時刪除元素,你唯一的選擇就是迭代器。

2

迭代器:它可以讓你在需要的時候的結果,不獲取所有結果內存

3

使用的Iterator是將List從定義class外,你可以不小心覆蓋更保護訪問例如,整個List。您一次只能訪問一個元素:頂級元素。

因此,我們使用的指導方針是在定義類中只使用for each方法,並且每當需要從外部訪問List時都必須使用迭代器。這也強制了保持如何修改class中包含它的成員的邏輯的概念。外部需要的所有複雜操作必須在class內的public方法中實施。