一道看似簡單的題(刪除List中的元素)
一道看似簡單的題目,我卻掉坑裡了。第一眼看到這題,沒考慮太多,就直接寫了size=0,結果答案當然就是錯了,當時還想不通。編個程式來除錯一下,終於弄懂了。
題目:下面程式碼結束後,list的內容是什麼?
List list = new ArrayList();
for(int i=0;i<10;i++){
list.add("test" + i) ;
}
for(int j=0;j<list.size();j++){
list.remove(j);
}
沒有經驗的我,第一眼一看,就認為“全部刪除了,list空了。打印出來的應該是一個‘[]’,size=0”。可是我想錯了。當我除錯程式,看到列印結果後驚呆了。我們將程式修改一下,打印出來看看吧:
看一下列印結果:List list = new ArrayList(); for(int i=0;i<10;i++){ list.add("test" + i) ; } System.out.println("remove前:\n size=" + list.size() + "\n list=" + list); for(int j=0;j<list.size();j++){ list.remove(j); } System.out.println("remove後:\n size=" + list.size() + "\n list=" + list);
remove前:
size=10
list=[test0, test1, test2, test3, test4, test5, test6, test7, test8, test9]
remove後:
size=5
list=[test1, test3, test5, test7, test9]
驚呆了,居然沒有全部刪掉!!!
分析一下原因吧。
從列印結果來看,第一個迴圈添加當然是沒問題的,十個元素都加進去了。第二個迴圈刪除,為何沒有全部刪掉呢?
因為再迴圈中,list的size在改變:最初 size=10
① j=0時:list.remove(j) 刪除了最初list中位置為0的元素test0,此時 list 的 size 就變成了9,list中的每個元素的位置都向前移動,移動後的位置為原來的減一(以下遞迴);
② j=1時:list.remove(j) 刪除了①list中位置為1的元素test2,此時 list 的 size 就變成了8;
③ j=2時:list.remove(j) 刪除了②list中位置為2的元素test4,此時 list 的 size 就變成了7;
④ j=3時:list.remove(j) 刪除了③list中位置為3的元素test6,此時 list 的 size 就變成了6;
⑤ j=4時:list.remove(j) 刪除了④list中位置為4的元素test8,此時 list 的 size 就變成了5;
⑥ j=5時,迴圈結束,因為 j=5 沒有滿足 “j<list.size()” 。此時list就是第⑤步結束後的list。
所以,在第二個迴圈刪除的時候只刪掉了“test0,test2,test4,test6,test8”。
從上面的分析,我們知道list在刪除的某個元素的時候其他元素的位置有可能會改變。
但是,如果我們換一種方式刪除的話,就不會出現位置變化的問題了,從最後一個元素開始刪除:
List list = new ArrayList();
for(int i=0;i<10;i++){
list.add("test" + i) ;
}
System.out.println("remove前:\n size=" + list.size() + "\n list=" + list);
for(int j=list.size()-1;j>-1;j--){ //list中的最後一個元素的位置是size-1
list.remove(j);
}
System.out.println("remove後:\n size=" + list.size() + "\n list=" + list);
列印結果:remove前:
size=10
list=[test0, test1, test2, test3, test4, test5, test6, test7, test8, test9]
remove後:
size=0
list=[]
這樣就全部刪掉了。
我是java菜鳥,期待您的指導!加油!!!