乱序集合,遍历删除时避免【并发修改异常】
1.需求
将1-100个数字,打乱顺序放到集合中,并删掉奇数。
2.实现
步骤1:把数字放到集合中,创建集合,注意要泛型。for循环是1到100。
步骤2:集合乱序,方法:Collections.shuffle(传入的集合)。 一般带s的是工具类。 用到Collections(带s)集合工具类中的shuffle(洗牌)方法,其内部是算法。
注意,shuffle传入的list1集合,但是后面list1就变化了,即参数发生变化。而这种参数发生变化的,我们称之此
方法有副作用。副作用一般是我们写代码的时候并不是我们想起到的作用,所以,自己设计方法的时候要避免有方
法的副作用。
步骤3:边遍历变删除。
3.代码
package com.lianxi1019;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class Dm01 {
public static void main(String[] args) {
// 创建乱序集合list1
List<Integer> list1 = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list1.add(i);
}
Collections.shuffle(list1);
// 用迭代器遍历
Iterator<Integer> iterator1 = list1.iterator();
while (iterator1.hasNext()) {
if (iterator1.next() % 2 == 1) {
iterator1.remove();
}
}
System.out.println("迭代器: " + list1 + " ,和数组大小: " + list1.size());
// 创建乱序集合list2
List<Integer> list2 = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list2.add(i);
}
Collections.shuffle(list2);
// 用迭代器简化来遍历
list2.removeIf(integer -> integer % 2 == 1);
System.out.println("迭代器简化: " + list2 + " ,和数组大小: " + list2.size());
// 创建乱序集合list03
List<Integer> list3 = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list3.add(i);
}
Collections.shuffle(list3);
// 用for i 倒着遍历
for (int i = list3.size() - 1; i > -1; i--) {
if (list3.get(i) % 2 == 1) {
list3.remove(i);
}
}
System.out.println("fori倒着: " + list3 + " ,和数组大小: " + list3.size());
}
}
注意:
- 如果用list.remove来 边遍历边删除,会出现“并发修改异常”。
- list集合是允许边遍历边删除的,有两种做法:
- 迭代器遍历删除,就是上面的做法
- for i 循环遍历删除,但是可能会出现“下标越界异常”,所以应该倒着遍历。
- 重点应该是边遍历边删除。
- 使用Iterator迭代器遍历 ,会出现
<The loop could be replaced with Collection.removeIf>
这个警告,提示是该循环可以用Collection.removeIf替换 ,也就是说迭代器遍历可以写成:list1.removeIf(integer -> integer % 2 == 1);而此方法返回的是boolean。 - list.remove方法是有重载的,1.按下标删除;2.按元素删除。
- 使用Iterator迭代器遍历 ,会出现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效