2013-07-09 31 views
-2

如果我們有2種方法來遍歷:通過集合進行迭代。有什麼區別?

第一:

Object ob; 
ArrayList<Obect> list; 
for(int i=0;i<list.size();i++) 
{ //Todo} 

二:

Object ob; 
ArrayList<Obect> list; 
for(Object o:list) 
{ //Todo} 

那麼有什麼區別?我發現在第二種情況下,如果嘗試在這個循環中移除對象,我會得到一個併發修改異常。

+4

看那[文檔](http://docs.oracle.com/javase/tutorial /java/nutsandbolts/for.html)以獲取更多信息。 –

+0

第一種情況通常不是刪除對象的好選擇。考慮當你將當前索引處的對象移除到列表中剩餘的項目和循環索引時會發生什麼。 –

回答

6

在第一個示例中,您自己遍歷列表。如果在迭代期間修改集合,則必須承擔維護迭代狀態的責任。

在第二個示例中,您正在使用的「foreach」循環在幕後使用了隱式Iterator。如果您使用活動的Iterator自己修改集合,則會得到ConcurrentModificationException

如果必須同時使用Iterator刪除元素,然後使用一個明確的Iterator

for(Iterator<Object> itr = list.iterator(); itr.hasNext()) 
{ 
    Object o = itr.next(): 
    if (decideToRemove) 
     itr.remove(); 
} 

Iteratorremove操作被允許不扔ConcurrentModificationException刪除的元素。

0

的正確方法從集合中刪除是使用第3種循環的,看起來像這樣:

for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext();) { 
     Object o = iterator.next(); 
     if (someCondition()) 
      iterator.remove(); 
    }