目錄
1.增強for
2.迭代器(在遍歷的過程中需要刪除元素,請使用迭代器)
3.雙列集合
4.Lambda表達式(forEach方法)
1.單列集合:
2.雙列集合:
4.Stream 流
5.普通for循環
6.列表迭代器
7.總結
1.增強for
注:增強for遍歷集合的內部不要對集合本身做更改,如remove。
如:
for (EnergyWorkshop energyWorkshop : energyWorkshopList) {//根據車間名稱查詢車間信息EnergyWorkshop energyWorkshop1 = energyWorkshopMapper.selectWorkshopByWorkshopName(energyWorkshop.getWorkshopName());if(ObjectUtil.isNotNull(energyWorkshop1)){//String workshopName = energyWorkshop1.getWorkshopName();energyWorkshopList3.add(energyWorkshop1);//移除掉和數據庫的數據同名稱的energyWorkshopList.remove(energyWorkshop);}
}
在遍歷energyWorkshopList
的同時對其進行修改(通過remove
方法)。這是非常危險的,因為在迭代過程中修改集合會導致ConcurrentModificationException
(并發修改異常)。這是因為Java的迭代器在迭代開始時會記錄一個快照(稱為modCount
),當集合被修改時,這個快照會改變。如果迭代器發現快照與它開始迭代時的快照不匹配,就會拋出ConcurrentModificationException
。
可以用迭代器解決!
Iterator<EnergyWorkshop> iterator = energyWorkshopList.iterator();
while (iterator.hasNext()) {EnergyWorkshop energyWorkshop = iterator.next();EnergyWorkshop energyWorkshop1 = energyWorkshopMapper.selectWorkshopByWorkshopName(energyWorkshop.getWorkshopName());if (ObjectUtil.isNotNull(energyWorkshop1)) {energyWorkshopList3.add(energyWorkshop1);iterator.remove(); //安全地刪除元素}
}
2.迭代器(在遍歷的過程中需要刪除元素,請使用迭代器)
迭代器在遍歷集合的時候是不依賴索引的。
舉例:
迭代器的細節注意點:
1.報錯NoSuchElementException
2.迭代器遍歷完畢,指針不會復位(如果還想第二次遍歷集合,則需要再次創建一個新的迭代器來遍歷)
3.循環中只能用一次next方法(next()方法 和 hasNext()方法 使用的時候要一一對應)
4.迭代器遍歷時,不能用集合的方法進行增加或者刪除。(應該用迭代器的方法去操作)
3.雙列集合
以上兩種方法都是適用于單列集合,雙列集合使用的話要先做一些前置操作
(提取"鍵"或者提取"鍵值對")
4.Lambda表達式(forEach方法)
1.單列集合:
list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
});//lambda表達式形式
list.forEach(s -> System.out.println(s));//Set集合
set.forEach( s -> System.out.println(s));
List單列集合:forEach方法的底層是普通for循環
Set單列集合:forEach方法的底層是增強for
2.雙列集合:
map.forEach(new Biconsumer<String, String>() {@Overridepublic void accept(string key, string value) {System.out.println(key + "=" + value);}
});
map.forEach((key, value) -> System.out.println(key + "=" + value));
方法的底層:entrySet()方法 + 增強for + getKey() + getValue()
4.Stream 流
本質就是Lambda表達式。。。
5.普通for循環
只有 List接口下的集合 有索引,所以只有List集合能使用普通for循環去遍歷。
6.列表迭代器
只有List接口下的集合才可以用這種方法遍歷。
舉例:
獲取一個列表迭代器的對象,里面的指針默認也是指向0索引的。
列表迭代器相比迭代器的特殊之處:
它額外添加了一個方法:在遍歷的過程中,可以添加元素。
ListIterator<string> it = list.listIterator();
while(it.hasNext()){String str = it.next();if("bbb".equals(str)){it.add("qqq");}
}
System.out.println(list);