JAVA List刪除時需注意的地方


JAVA的LIST在刪除時,一般會用list.remove(o); 但這樣往往會出現問題,先來看下面的這段代碼:

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();
		
	}

}

 返回結果是:

1

2

3

這結果顯然不是我們的預期,我們是希望刪除List中所有為2的元素,但輸出結果中卻出現了2,這是因為在i等於1時,刪除了List中的index為1的元素2,這時候list為[1,2,3], 但接下來,i遞增后,等於2,在list.get(i)時,取出來的結果就成為了3了,也就是說隨着list元素的刪除,index是隨之變化的,這就是其中的陷阱,於是,我們得尋找一個在刪除時,索引不發生變化的迭代方式來刪除,而iterator是被創建之后會建立一個指向原來對象的單鏈索引表當原來的對象數量發生變化時這個索引表的內容不會同步改變,也就是用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();
		
	}

}

 

 這個代碼結果就是正確的了!

可能有人會說,我是在iterator中刪除的,為什么list的值會發生改變?這個問題,自已思考去吧!思考不出來,可以轉行了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM