国产探花免费观看_亚洲丰满少妇自慰呻吟_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方法,導致刪除元素時涉及到數組元素的移動。所以將元素從數組中刪除,并且將后一個元素移動至當前位置,導致下一次循環遍歷時后一個字符串并沒有遍歷到,所以無法刪除。針對這種情況可以倒序刪除的方式來避免:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常州市| 磴口县| 乌兰县| 宾阳县| 股票| 闸北区| 福泉市| 贵定县| 安溪县| 海伦市| 图片| 从化市| 高青县| 香港 | 灵寿县| 赤壁市| 华容县| 台山市| 平谷区| 花莲市| 灵璧县| 偃师市| 莱州市| 三河市| 区。| 青铜峡市| 巴东县| 若尔盖县| 孝感市| 武义县| 库尔勒市| 新绛县| 南木林县| 泸州市| 库伦旗| 庆城县| 巨鹿县| 安达市| 太和县| 万年县| 轮台县|