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