目录
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);