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

 更新时间:2022年05月19日 08:23:12   作者:IT利刃出鞘  
这篇文章主要为大家详细介绍了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);
    }
}

以上就是详解Java中List的正确的删除方法的详细内容,更多关于Java List删除方法的资料请关注脚本之家其它相关文章!

相关文章

  • java取出list中某几个属性组成一个新集合的几种方式

    java取出list中某几个属性组成一个新集合的几种方式

    在Java开发中经常需要对List中的对象进行一些操作,例如对某个字段进行过滤、排序等,这篇文章主要给大家介绍了关于java取出list中某几个属性组成一个新集合的几种方式,需要的朋友可以参考下
    2024-03-03
  • Java数据结构彻底理解关于KMP算法

    Java数据结构彻底理解关于KMP算法

    这篇文章主要介绍了Java数据结构关于KMP算法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 浅谈java异常处理(父子异常的处理)

    浅谈java异常处理(父子异常的处理)

    下面小编就为大家带来一篇浅谈java异常处理(父子异常的处理)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JAVA实现按时间段查询数据操作

    JAVA实现按时间段查询数据操作

    这篇文章主要介绍了JAVA实现按时间段查询数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Spring @Profile注解实现多环境配置

    Spring @Profile注解实现多环境配置

    这篇文章主要介绍了Spring @Profile注解实现多环境配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • spring如何使用命名空间p简化bean的配置

    spring如何使用命名空间p简化bean的配置

    这篇文章主要介绍了spring如何使用命名空间p简化bean的配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java使用OTP动态口令(每分钟变一次)进行登录认证

    Java使用OTP动态口令(每分钟变一次)进行登录认证

    这篇文章主要介绍了Java使用OTP动态口令(每分钟变一次)进行登录认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • SpringBoot框架实现支付和转账功能

    SpringBoot框架实现支付和转账功能

    在 Spring Boot 框架中实现支付和转账功能时,涉及到多个细节和注意点,这些功能通常需要高度的安全性、稳定性和可扩展性,本文介绍了实现支付和转账功能的一些关键点,需要的朋友可以参考下
    2024-08-08
  • Spring Boot与Kotlin处理Web表单提交的方法

    Spring Boot与Kotlin处理Web表单提交的方法

    本篇文章主要介绍了Spring Boot 与 Kotlin 处理Web表单提交的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • java中实现创建目录与创建文件的操作实例

    java中实现创建目录与创建文件的操作实例

    用Java创建文件或目录非常简单,下面这篇文章主要给大家介绍了关于java中实现创建目录与创建文件的操作实例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01

最新评论