乱序集合,遍历删除时避免【并发修改异常】

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());
  }
}

注意:

  1. 如果用list.remove来 边遍历边删除,会出现“并发修改异常”。
  2. list集合是允许边遍历边删除的,有两种做法:
    1. 迭代器遍历删除,就是上面的做法
    2. for i 循环遍历删除,但是可能会出现“下标越界异常”,所以应该倒着遍历。
  3. 重点应该是边遍历边删除。
    1. 使用Iterator迭代器遍历 ,会出现<The loop could be replaced with Collection.removeIf>这个警告,提示是该循环可以用Collection.removeIf替换 ,也就是说迭代器遍历可以写成:list1.removeIf(integer -> integer % 2 == 1);而此方法返回的是boolean。
    2. list.remove方法是有重载的,1.按下标删除;2.按元素删除。
posted @ 2022-02-16 10:09  Charles博客  阅读(244)  评论(0编辑  收藏  举报