最近在公司專案中需要實現:在兩個實體物件不同的列表中,刪除a列表中包含b列表,通過判斷a中實體和b中實體某乙個屬性是否相同來刪除。期間出現indexoutofbound***ception ,concurrentmodificationexception,illegalstateexception等等異常,解決完寫一篇記錄下。
循序漸進,分析幾個常見的遍歷刪除及其出錯的原因:
常見錯誤方法一:
listlist = new arraylist<>();
collections.addall(list, 9, 1, 3, 6, 5);
int size = list.size();
for (int i = 0; i < size; i++)
}
此時會報indexoutofbound***ception
原因:size此刻是乙個常量,大小是不變的,刪除了其中乙個非末尾(最後乙個)的元素,當遍歷到最後乙個元素時,索引大於了list的大小,自然就陣列越界了,從中也可以看出remove方法會改變list.size()方法的大小。
常見錯誤方法二:
for (integer value : list)
}
此時會丟擲concurrentmodificationexception
原因:arraylist中有modcount
是abstractlist
類中的乙個成員變數,
expectedmodcount
:表示對
arraylist
修改次數的期望值,它的初始值為
modcount
。每次remove 的時候會呼叫
checkforcomodification,檢查
expectedmodcount是否等於
modcount,如果不相等則丟擲
concurrentmodificationexception。而每次的remove,在fastremove()方法中
modcount都會加1,導致兩個數不想等。
此刻不禁會有疑問,為什麼remove(index) 拋的是
indexoutofbound***ception,而remove(object)拋的卻是
concurrentmodificationexception?難道remove(index)沒有呼叫checkforcomodification,
期待大神解答。
常見錯誤方法三:
for (int i = 0; i < list.size(); i++)
}
此時沒有拋異常,但是不能實現我們需要的功能,我們想刪除1,3,6,但是結果呈現的是只刪除了1和6。為什麼會出現這種情況吶?
原因:1的索引為2,當刪除了1後,list的長度變化,3變到1的位置,而1刪除後索引還是加1,導致3成了落網之魚,而6的索引是2,所以當索引加到2時,6也就被刪除了。
單列表操作正確方法一:
for (int i = 0; i < list.size(); i++)
}
單列表操作正確方法二:
for (int i = list.size() - 1; i >= 0; i--)
}
iteratorit = list.iterator();
while (it.hasnext())
}
listlistrepeat = new arraylist<>();
collections.addall(listrepeat, 9, 1, 3);
setset = new hashset<>(listrepeat);
iteratorit = set.iterator();
while (it.hasnext()) }}
for (integer i : listrepeat)
JAVA List 移除元素
arraylistlist newarraylist list.add one list.add two list.add two list.add two list.add two for inti 0 iif list.get i equals two system.out.println li...
java List基本操作
list中新增,獲取,刪除元素 list中是否包含某個元素 list中根據索引將元素數值改變 替換 list中檢視 判斷 元素的索引 根據元素索引位置進行的判斷 利用list中索引位置重新生成乙個新的list 擷取集合 判斷list是否為空 返回iterator集合物件 將集合轉換為字串 將集合轉換...
java list移除null元素
listls new arraylist list.add 1 list.add 2 list.add null list.add 3 list.add null list.add 4 如果只需移除第乙個null,那麼直接ls.remove null 如果要全部移除,可以這樣 liste new a...