Java List資料刪除

2021-08-20 13:19:09 字數 2099 閱讀 3024

最近在公司專案中需要實現:在兩個實體物件不同的列表中,刪除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...