国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java ArrayList遍歷時刪除元素

2019-11-06 09:21:43
字體:
來源:轉載
供稿:網友
for(int i = 0;i<10;i++){ list.add(i); } //第一種刪除方式 Iterator<Integer> it = list.iterator(); while(it.hasNext()){ int t = it.next(); it.remove();//通過迭代器來刪除元素不會發生ConcurrentModificationException }

itr.hasNext():通過判斷 cursor(游標) != size(長度)來決定是否結束循環,cursor(游標) 初始是0 每次經過 itr.next() +1;當cursor==size時 會跳出循環;

itr.next(): 看源代碼可以發現每次在next()調用后,都會先調用checkForComodification()這個方法;

checkForComodification(): 主要作用是判斷itr迭代器數據是否和list一致,

有兩個參數,

第一個 modCount 集合結構變動次數,如:一開始你add調用了7次,那么這個數就是7,

第二個 expectedModCount 在調用iterator()方法時,初始化值等于modCount ,

這個方法判斷當 modCount != expectedModCount 時 拋出異常ConcurrentModificationException,如果你調用迭代器的remove方法,expectedModCount 會重新賦值,但是你調用的是list的remove方法,那么modCount 就會+1 而expectedModCount 不變,這就會造成 modCount != expectedModCount;

//第二種刪除方式 for(int i = 9;i>=0;i--){//使用倒序刪除方式同樣不會發生異常 list.get(i); list.remove(i); }

ArrayList中的remove有兩個同名方法,只是入參不同,這里看的是入參為Object的remove方法)是怎么實現的:

public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } PRivate void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work }

可以看到會執行System.arraycopy方法,導致刪除元素時涉及到數組元素的移動。所以將元素從數組中刪除,并且將后一個元素移動至當前位置,導致下一次循環遍歷時后一個字符串并沒有遍歷到,所以無法刪除。針對這種情況可以倒序刪除的方式來避免:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰安市| 岳阳县| 临泉县| 威信县| 河北省| 新巴尔虎左旗| 吉林市| 舟山市| 深水埗区| 民乐县| 信阳市| 比如县| 祁门县| 九江县| 永德县| 陕西省| 芒康县| 乌拉特中旗| 延庆县| 新竹县| 新津县| 哈尔滨市| 宝坻区| 上思县| 盘锦市| 奉节县| 昌黎县| 鄂伦春自治旗| 阜宁县| 江口县| 汉阴县| 伊通| 洛扎县| 江永县| 武夷山市| 邵阳县| 佛坪县| 丰县| 莱西市| 大姚县| 青铜峡市|