软件编程
位置:首页>> 软件编程>> java编程>> 详解Java中List的正确的删除方法

详解Java中List的正确的删除方法

作者:IT利刃出鞘  发布时间:2021-09-19 13:20:42 

标签:Java,List,删除,方法

简介

本文介绍Java的List的正确的删除方法。

实例

需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉。即:填充removeB()方法

package com.example.a;

import java.util.ArrayList;
import java.util.List;

public class Demo {
   public static void main(String[] args) {
       List<String> list = new ArrayList<>();
       list.add("a");
       list.add("b");
       list.add("b");
       list.add("c");
       list.add("d");

removeB(list);
   }

private static void removeB(List<String> list) {
       // 待填充
   }
}

正确方法

法1:for的下标倒序遍历

private static void removeB(List<String> list) {
   for (int i = list.size() - 1; i >= 0; i--) {
       if ("b".equals(list.get(i))) {
           list.remove(i);
       }
   }
   System.out.println(list);
}

结果

[a, c, d]

法2: list.stream().filter().collect()

private static void removeB(List<String> list) {
   List<String> newList = list.stream()
           .filter(e -> !"b".equals(e))
           .collect(Collectors.toList());
   System.out.println(newList);
}

结果

[a, c, d]

法3: iterator迭代器

private static void removeB(List<String> list) {
   Iterator<String> it = list.iterator();
   while (it.hasNext()) {
       String s = it.next();
       if ("b".equals(s)) {
           it.remove();
       }
   }
   System.out.println(list);
}

结果

[a, c, d]

错误方法

法1:for(xxx : yyy)遍历

private static void removeB(List<String> list) {
   for (String s : list) {
       if ("b".equals(s)) {
           list.remove(s);
       }
   }
   System.out.println(list);
}

结果(报异常)

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at com.example.a.Demo.removeB(Demo.java:18)
    at com.example.a.Demo.main(Demo.java:14)

法2:for的下标正序遍历

private static void removeB(List<String> list) {
   for (int i = 0; i < list.size(); i++) {
       if ("b".equals(list.get(i))) {
           list.remove(list.get(i));
       }
   }
   System.out.println(list);
}

结果(有的没有删除掉)

[a, b, c, d]

原因分析

需求:通过遍历把list集合的所有数据删除掉。

package com.example.a;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

public class Demo {
   private static List<String> list = new ArrayList<>();

public static void main(String[] args) {
       reset();
       // method1();
       // method2();
       // method3();
       // method4();
   }

private static void reset(){
       list.clear();
       list.add("a");
       list.add("b");
       list.add("c");
       list.add("d");
       list.add("e");
   }

/**
    * 方法一:遍历删除第i个元素(错误版)
    * 执行结果:没有完全删除。打印结果:[b, d]
    */
   /**
    * 下面遍历操作过程如下:
    * i = 0    list.size() == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
    * i = 1    list.size() == 4   执行完第二次list.remove(1);  list剩下[b,d,e]
    * i = 2    list.size() == 3   执行完第三次list.remove(2);  list剩下[b,d]
    * i = 3    list.size() == 2   i > list.size()所以条件不满足,最后剩下[b,d]
    */
   public static void method1() {
       for (int i = 0; i< list.size(); i++) {
           list.remove(i);
       }
       System.out.println(list);
   }

/**
    * 方法二:删除第0个元素(错误版)
    *  执行结果:元素没有删除。打印结果:[d, e]
    */
   /**
    * 下面遍历操作过程如下:
    * i = 0    list.size() == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
    * i = 1    list.size() == 4   执行完第二次list.remove(0);  list剩下[c,d,e]
    * i = 2    list.size() == 3   执行完第三次list.remove(0);  list剩下[d,e]
    * i = 3    list.size() == 2   i > list.size()所以条件不满足,最后剩下[d,e]
    */
   public static void method2() {
       for (int i = 0; i< list.size(); i++) {
           list.remove(0);
       }
       System.out.println(list);
   }

/**
    * 方法三:只取一次长度删除第i个(错误版)
    * 执行结果:报错。打印结果:
    *   Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
    */
   /**
    * 只求取list.size()长度一次
    * i == 0 len == 5 list.remove(0) list剩下[b,c,d,e]
    * i == 1 len == 5 list.remove(1) list剩下[b, d,e]
    * i == 2 len == 5 list.remove(2) list剩下[b, d]
    * i == 3 len == 5 list.remove(3) list因为没有第四个元素,于是报索引越界错误
    */
   public static void method3() {
       int len = list.size();
       for (int i = 0; i < len; i++) {
           list.remove(i);
       }
       System.out.println(list);
   }

/**
    * 方法四:只取一次长度删除第0个(正确版)
    * 执行结果:完全删除。打印结果:[]
    */
   /**
    * 下面遍历操作过程如下:
    * i = 0    len == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
    * i = 1    len == 5   执行完第二次list.remove(0);  list剩下[c,d,e]
    * i = 2    len == 5   执行完第三次list.remove(0);  list剩下[d,e]
    * i = 3    len == 5   执行完第四次list.remove(0);  list剩下[e]
    * i = 4    len == 5   执行完第五次list.remove(0);   list剩下[]
    */
   public static void method4() {
       int len = list.size(); // 保证只获取一次长度
       for (int i = 0; i< len; i++) {
           list.remove(0);
       }
       System.out.println(list);
   }
}

来源:https://blog.csdn.net/feiying0canglang/article/details/124853294

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com