国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

淺談List使用的一個易錯點

2019-11-06 06:25:55
字體:
來源:轉載
供稿:網友

這個問題還是我去年在項目中遇到的,一直沒來得及總結。最近同事在他的項目中遇到了類似的問題,讓我感覺到有必要總結一下這個易錯點。

首先貼上測試代碼吧。

import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.ListIterator;public class DeleteList { public static void main(String[] args) { // ArrayList測試 ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(0); arrayList.add(1); arrayList.add(2); arrayList.add(3);// PRintAndDelete(arrayList); //(1)// printAndDeleteWithIterator(arrayList); //(2) // printAndDeleteWithListIterator(arrayList); //(3) // LinkedList測試 LinkedList<Integer> linkedList = new LinkedList<Integer>(); linkedList.add(0); linkedList.add(1); linkedList.add(2); linkedList.add(3);// printAndDelete(linkedList); //(4)// printAndDeleteWithIterator(linkedList); //(5)// printAndDeleteWithListIterator(linkedList); //(6) } /* 直接打印后刪除 */ public static void printAndDelete(List<Integer> list) { for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); list.remove(i); } } /* 通過迭代器來實現打印后刪除 */ public static void printAndDeleteWithIterator(List<Integer> list){ Iterator<Integer> iterable = list.iterator(); while(iterable.hasNext()) { System.out.println(iterable.next()); iterable.remove(); } } /* 通過List專有迭代器來實現打印后刪除 */ public static void printAndDeleteWithListIterator(List<Integer> list) { ListIterator<Integer> listIterator = list.listIterator(); while(listIterator.hasNext()) { System.out.println(listIterator.next()); listIterator.remove(); } }}

在以上代碼中,運行printAndDelete(List<Integer> list) 方法你會發現,只打印了0和2兩個數字,可能咋一看不是很好理解。現在我們通過debugger模式來進行簡單分析: (1) 當i=0時 List數據的狀態如下圖所示: 這里寫圖片描述

從圖中可以看出,此時List的size為4,索引i=0所對應的值為0。

(2) 當i=1時 在執行一遍循環后,i=1,此時List數據的狀態如下圖所示: 這里寫圖片描述

從圖中可以看出,此時List的size變成了3,并且數據的索引相對于前一個狀態發生了變化,這是因為上一遍循環中刪除了一個元素。此時索引i=1對應的值為2。

(3) 當i=2時 在執行完第二遍循環后,i=2,此時List數據的狀態如下圖所示: 這里寫圖片描述

從圖中可以看出,此時List的size變成了2,并且數據的索引相對于前一個狀態發生了變化,這是第二遍循環中又刪除了一個元素。此時i小于list.size()不再成立,退出循環。

綜上,我們可以發現,第二個元素和第四個元素并沒有被訪問。回到開篇時我講到的,這個問題還是在項目中發現的,當時的情況就是在刪除之前對List 的元素做了一些處理,然后發現并不是所有元素都得到了處理。在此總結,希望可以給你提個醒。

那么解決這個問題的辦法就是使用迭代器來遍歷和處理List中的元素,這樣就不會發生這個問題了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天峻县| 稻城县| 桑日县| 雷州市| 河北区| 兰西县| 新巴尔虎右旗| 松桃| 彭水| 红安县| 曲阳县| 宁乡县| 文登市| 华坪县| 宣汉县| 云阳县| 湄潭县| 光山县| 海城市| 镇安县| 腾冲县| 江陵县| 永年县| 阿克陶县| 商水县| 阿城市| 莒南县| 凉城县| 新蔡县| 湖口县| 肇庆市| 雷州市| 靖江市| 苍山县| 平谷区| 青海省| 陇川县| 朝阳市| 恩平市| 泸西县| 德格县|