目录
1.各种循环遍历方法简述
1.1. 普通for循环
结构及举例:for(初始条件;终止条件;步进表达式){ 操作 }
for (int i = 0; i < userList.size(); i++) {
System.out.println(userList.get(i).getId());
}
特点:根据下标索引进行遍历,有利于定位到在指定索引的元素,方便修改元素的值,灵活控制。
1.2. 增强for循环
结构及举例:for(数据类型 变量名 : 集合){ 操作 }
for (User user : userList) {
System.out.println(user.getId());
}
特点:
1.3. forEach循环
结构及举例:集合 . forEach(变量名 -> {操作});
userList.forEach(user -> System.out.println(user.getId()));
特点:forEach循环是Java8引入的;结构上是增强for循环+Lambda表达式,代码看上去更简洁;
1.4. 迭代器循环
结构及举例:
Iterator<User> iterator = userList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getId());
}
特点:
2. 应用对象
数组遍历:普通for遍历、增强for、while和do while,常用:普通for和增强for;
list集合遍历:四种都可用,常用:增强for和forEach;
map集合遍历:forEach循环、迭代器循环,常用:forEach;
3. 应用场景避坑
3.1 循环遍历的同时有remove操作
3.1.1常用推荐
- 迭代器循环,迭代器remove操作时,如果有并发操作需要对Iterator对象加锁,下面是一般情况举例:
//迭代器
Iterator<User> iterator = userList.iterator();
while (iterator.hasNext()) {
if ("122".equals(iterator.next().getId())) {
iterator.remove();
}
}
-
removeIf+lambda方法:实现简单且代码比较精简。推荐!!!
//removeIf+lambda
userList.removeIf(user -> "122".equals(user.getId()));
- 还有其他正确操作:①普通for循环倒叙遍历并remove;②使用 removeAll
List<String> list = new ArrayList<>();
CollectionUtils.addAll(list,"122","002","122","001","002","001","003","122","001");
System.out.println(list);
//普通for循环倒叙遍历并remove
for (int i = list.size()-1; i >=0; i--) {
if ("122".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list);
//使用 removeAll方法 删除
List<String> removeList = new ArrayList<>(Arrays.asList("001","002"));
list.removeAll(removeList);
System.out.println(list);
输出:
- 注:正序的普通for循环、增强for、forEach循环遍历remove都会报错,原因如下:
- 正序普通for循环:list 对象的modCount值进行了修改,而 list对象的迭代器中的expectedModCount值没有修改,所以抛出了异常
- 增强for和forEach循环:http://t.csdnimg.cn/bA8W0