java中List刪除時需要的注意事項
java中的LIST在刪除時,一般會用list.remove(o);
但這樣往往會出現(xiàn)問題,先來看下面的這段代碼:
package com.demo; import java.util.ArrayList; import java.util.List; public class Test11 { public void delete(){ List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); for (int i = 0; i < list.size(); i++) { if(list.get(i)==2){ list.remove(i); } } this.outputList(list); } private void outputList(List<Integer> list){ for (Integer i : list) { System.out.println(i); } } public static void main(String[] args) { Test11 t = new Test11(); t.delete(); } }
返回結(jié)果是:
1 2 3
這結(jié)果顯然不是我們的預(yù)期,我們是希望刪除List中所有為2的元素,但輸出結(jié)果中卻出現(xiàn)了2,這是因為在i等于1時,刪除了List中的index為1的元素2,這時候list為[1,2,3], 但接下來,i遞增后,等于2,在list.get(i)時,取出來的結(jié)果就成為了3了,也就是說隨著list元素的刪除,index是隨之變化的,這就是其中的陷阱,于是,我們得尋找一個在刪除時,索引不發(fā)生變化的迭代方式來刪除,而iterator是被創(chuàng)建之后會建立一個指向原來對象的單鏈索引表,當(dāng)原來的對象數(shù)量發(fā)生變化時,這個索引表的內(nèi)容不會同步改變,也就是用cursor來維護這個索引表,于是,可以這樣來刪除:
package com.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test11 { public void delete(){ List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); this.iteratorDelete(list.iterator(), 2); this.outputList(list); } private void iteratorDelete(Iterator<Integer> it, int deleteObject){ while(it.hasNext()){ int i = it.next(); if(i==deleteObject){ it.remove(); } } } private void outputList(List<Integer> list){ for (Integer i : list) { System.out.println(i); } } public static void main(String[] args) { Test11 t = new Test11(); t.delete(); } }
這個代碼結(jié)果就是正確的了!
可能有人會說,我是在iterator中刪除的,為什么list的值會發(fā)生改變?這個問題,自已思考去吧!思考不出來,可以轉(zhuǎn)行了!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Mybatis整合達夢數(shù)據(jù)庫的完整步驟記錄
作為國產(chǎn)數(shù)據(jù)庫,達夢做的不錯,提供的遷移工具也相當(dāng)不錯,下面這篇文章主要給大家介紹了關(guān)于Mybatis整合達夢數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02在Spring Data JPA中引入Querydsl的實現(xiàn)方式
這篇文章主要介紹了在Spring Data JPA中引入Querydsl的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01java9的JShell小工具和編譯器兩種自動優(yōu)化方法
這篇文章主要介紹了java9的JShell小工具和編譯器兩種自動優(yōu)化方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07