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

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

简介

本文介绍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

标签:Java,List,删除,方法
0
投稿

猜你喜欢

  • Android之复选框对话框用法实例分析

    2023-10-03 05:07:03
  • Java 关于递归的调用机制精细解读

    2023-01-17 04:42:41
  • 基于java枚举类综合应用的说明

    2023-02-16 09:39:25
  • Java接口统一样式返回模板简介

    2022-10-31 19:50:43
  • Spring Boot应用Docker化的步骤详解

    2023-10-12 11:47:36
  • java生成jar包并且单进程运行的实例

    2021-08-30 00:40:55
  • java实现简单的验证码功能

    2023-08-06 09:21:44
  • pageHelper一对多分页解决方案示例

    2022-08-22 19:55:22
  • C语言 MD5的源码实例详解

    2022-12-22 05:37:16
  • Java读取properties文件之中文乱码问题及解决

    2021-07-19 06:43:06
  • Android 性能优化系列之bitmap图片优化

    2023-11-05 14:03:20
  • C#中比较常用的DateTime结构的使用方法

    2023-01-06 21:33:11
  • java基础之泛型知识点总结

    2021-09-03 21:30:29
  • Android 屏幕双击事件的捕获简单示例

    2022-08-30 11:02:55
  • SSH原理及两种登录方法图文详解

    2023-11-14 11:10:53
  • SpringBoot集成Swagger2的方法

    2023-11-26 13:15:42
  • java使用jdbc操作数据库示例分享

    2023-10-29 13:54:21
  • Qt for Android开发实例教程

    2023-06-27 10:00:39
  • Android Touch事件分发过程详解

    2021-08-28 20:11:33
  • 关于Java中Json的各种处理

    2022-06-12 02:37:48
  • asp之家 软件编程 m.aspxhome.com