java中List刪除時(shí)需要的注意事項(xiàng)
java中的LIST在刪除時(shí),一般會(huì)用list.remove(o); 但這樣往往會(huì)出現(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,這是因?yàn)樵趇等于1時(shí),刪除了List中的index為1的元素2,這時(shí)候list為[1,2,3], 但接下來,i遞增后,等于2,在list.get(i)時(shí),取出來的結(jié)果就成為了3了,也就是說隨著list元素的刪除,index是隨之變化的,這就是其中的陷阱,于是,我們得尋找一個(gè)在刪除時(shí),索引不發(fā)生變化的迭代方式來刪除,而iterator是被創(chuàng)建之后會(huì)建立一個(gè)指向原來對(duì)象的單鏈索引表,當(dāng)原來的對(duì)象數(shù)量發(fā)生變化時(shí),這個(gè)索引表的內(nèi)容不會(huì)同步改變,也就是用cursor來維護(hù)這個(gè)索引表,于是,可以這樣來刪除:
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();
}
}
這個(gè)代碼結(jié)果就是正確的了!
可能有人會(huì)說,我是在iterator中刪除的,為什么list的值會(huì)發(fā)生改變?這個(gè)問題,自已思考去吧!思考不出來,可以轉(zhuǎn)行了!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
java中ThreadPoolExecutor常識(shí)匯總
這篇文章主要介紹了java中ThreadPoolExecutor常識(shí)匯總,線程池技術(shù)在并發(fā)時(shí)經(jīng)常會(huì)使用到,java中的線程池的使用是通過調(diào)用ThreadPoolExecutor來實(shí)現(xiàn)的,需要的朋友可以參考下2019-06-06
解決IDEA Maven下載依賴時(shí)報(bào)錯(cuò)ERROR - #org.jetbrains.ide
這篇文章主要介紹了解決IDEA Maven下載依賴時(shí)報(bào)錯(cuò)ERROR - #org.jetbrains.idea.maven - Cannot reconnect.問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Springcloud Stream消息驅(qū)動(dòng)工具使用介紹
SpringCloud Stream由一個(gè)中間件中立的核組成,應(yīng)用通過SpringCloud Stream插入的input(相當(dāng)于消費(fèi)者consumer,它是從隊(duì)列中接收消息的)和output(相當(dāng)于生產(chǎn)者producer,它是發(fā)送消息到隊(duì)列中的)通道與外界交流2022-09-09
Java調(diào)用Zookeeper的實(shí)現(xiàn)步驟
本文主要介紹了Java調(diào)用Zookeeper的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

