List爲什麼不能一邊遍歷 一邊操作

1、對於ArrayList,在使用Iterator遍歷時,不能使用list.add()、list.remove()等改變list的操作,只能用it.remove()
原因是ArrayList不是線程安全的,需在單線程環境下使用,如果在遍歷時還有別的線程做增刪操作,必然會有問題,如數組下標越界
ArrayList#Iterator設計的是不能在迭代時有別的線程對list修改,此種修改對當前迭代器是可能存在問題的,所以增加了對modCount的校驗
但當前迭代器可以remove,因爲它自己刪除就不是併發修改了
迭代器remove會重置expectedModCount,並將cursor往前一位

2、CopyOnWriteArrayList在使用Iterator遍歷時,可以用list.add(),list.remove()等改變list的操作,但不支持it.remove()
首先CopyOnWriteArrayList是用於多線程環境下的
因爲CopyOnWriteArrayList的Iterator實現類COWIterator會在創建時複製一份list的副本,之後迭代的是副本
所以期間怎麼對list.add(),list.remove()都沒事,list.remove()操作的是原始的list
但不支持it.remove()
因爲Iterator中的本身就是副本,刪除副本中的元素沒意義,如果去刪除原始list,在併發環境下此時list可能和創建迭代器時的副本已經完全不同了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章