fori和foreach的區別

2021-10-10 02:00:45 字數 1490 閱讀 8100

foreach遍歷時刪除為什麼會有異常

//通過角標和size對比判斷是否有下乙個

public

boolean

hasnext()

@suppresswarnings

("unchecked"

)public e next()

public

void

remove()

catch

(indexoutofbound***ception ex)

}final

void

checkforcomodification()

public

boolean

remove

(object o)

}else

}return

false;}

private

void

fastremove

(int index)

通過對比可看出:iterator刪除元素之後,把修改次數和期待修改次數置為相等。但是arraylist刪除元素僅僅將操作次數加1。由於foreach是通過iterator和while實現的,當hasnext成立時,iterator會呼叫next()方法,此時就會檢查操作次數和期待操作次數,就會報出異常。

假如說集合裡邊兩個元素,我只刪除第乙個元素,那麼foreach是不會報異常的。原因如下,foreach刪除第乙個元素,那麼操作次數加1,while迴圈繼續執行,判斷hasnext()返回true或false,此時cursor位置為1,集合size為1,那麼hasnext()返回false,不再執行next()取第二個元素了,也就不會判斷期待操作和操作是否相等了,也就不會報異常了

那麼正確的遍歷刪除怎麼做

通過fori的方法

因為fori不是通過iterator和while實現的,所以不會判斷操作次數和期待操作次數。雖然fori不會報錯,但是也有需要注意的地方,如圖所示:

雖然我們移除了等於3的元素,但是只移除了第乙個,第二個3並沒有移除。

這是因為for迴圈遍歷到index=3,刪除了第乙個3,第二個3因此往前移了一位index=3,此時for迴圈即將進行index=4的操作,所以第二個3沒有被刪除。

正確的做法如下

#####通過iterator方法

for和foreach的區別

public class program public void for for int i 0 i array.length i public static void foreachonarray foreach string s in array 再加點 在迴圈中試圖更改所操作的值 public...

map 和forEach 的區別

對陣列進行迴圈,相當於直接for迴圈,沒有返回值,不能對它進行加工,只是單純的迴圈顯示return無效 item值,index索引,arr該陣列 一般沒用 arr.foreach item,index,arr 對陣列的每一項進行加工,加工完成之後返回乙個新的陣列 注意 map 不會對空陣列進行檢測。...

map和forEach的區別

map 返回其原始陣列的新陣列,但是 foreach 卻沒有。但是它們都確保了原始物件的不變性。1,2,3 map d d 1 2,3,4 1 2,3 foreach d d 1 undefined 如果更改陣列內的值,foreach 不能確保陣列的不變性。這個方法只有在你不接觸裡面的任何值時,才能...