Java如何从List中删除元素的正确用法举例

 更新时间:2023年07月05日 15:08:37   作者:程序员xiaozhang  
这篇文章主要给大家介绍了关于Java如何从List中删除元素的正确用法, 列表List是Java中的一种数据结构,存放按照添加顺序的元素,是个有序的集合,需要的朋友可以参考下

还是先举个例子,你侄女对天文知识感兴趣,然后你就用程序写了太阳系九大星系(水星、金星、地球、火星、木星、土星、天王星、海王星、冥王星)的运行轨迹图,然后拿给侄女看。然后她说错了错了,你的知识太旧了,多了一颗星。根据2006年8月24日国际天文联合大会召开,在会议上经过投票表决,冥王星被降级为矮行星,太阳系目前只剩下八颗行星。所以你需要删除一颗星。这个时候你打开电脑开始删除冥王星。

你从下面List中删除一颗星。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"木星","土星","天王星","海王星","冥王星","冥王星");

怎么删除List中的冥王星呢?[PS为了演示某些删除方法不可靠,重复写了冥王星] 。

先写一段阿里规约:

【强制】不要再foreach循环里进行元素的remove/add操作,remove元素请使用Iterator方式,如果并发的操作,需要对Iterator对象加锁。

好了,那就让我们来写所有可能删除元素的方法

1:普通的for循环的删除(不可靠)

List<String> list = new ArrayList(tempList);
         for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            if ("冥王星".equals(str)) {
                list.remove(i);
            }
        }
        System.out.println(list);

 运行结果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星,    海王星, 冥王星]

奇了怪了,没删除干净?

问题出在 list.size(),因为 list.size() 和 i 都是动态变化的,i 的值一直在累加,list.size() 一直在减少,所以 list 就会早早结束了循环。所以这种方式虽然不会报错,但存在隐患,并且不容易被察觉,不建议使用。

2:普通的for循环提取变量进行删除(这个更不可靠,会报错)

List<String> list = new ArrayList(tempList);
        int size = list.size();
        for (int i = 0; i < size; i++) {
            String result = list.get(i);
            if ("冥王星".equals(result)) {
                list.remove(i);
            }
        }
        System.out.println(list);

结果如下:

 这更不对了,一下子搞出个下标越界。

因为 size 变量是固定的,但 list 的实际大小是不断减小的,而 i 的大小是不断累加的,一旦 i >= list 的实际大小肯定就异常了。

3:普通的for循环倒叙删除(这个用法可以)

for (int i = list.size() - 1; i > 0; i--) {
            String result = list.get(i);
            if ("冥王星".equals(result)) {
                list.remove(i);
            }
        }
        System.out.println(list);

运行结果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星, 海王星]

4:使用增强的for循环删除

会抛出异常,不推荐,注意我这次为了演示效果,把行星的顺序换一下),不少开发者喜欢用这种方式。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"冥王星","土星","天王星","海王星","冥王星","木星");
         List<String> list = new ArrayList(tempList);
        for (String item : list) {
            if ("冥王星".equals(item)) {
                list.remove(item);
            }
        }
        System.out.println(list);

结果如下:

奇了怪了,又抛异常了。不过这次的异常和上面的下标异常不太一样,这次是:

java.util.ConcurrentModificationException 

这个是集合操作中很常见的异常之一,即并发修改异常!

增强的 for循环,其内部是调用的 Iterator 的方法,取下个元素的时候都会去判断要修改的数量(modCount)和期待修改的数量(expectedModCount)是否一致,不一致则会报错,而 ArrayList 中的 remove 方法并没有同步期待修改的数量(expectedModCount)值,所以会抛异常了。

5、迭代器循环迭代器删除

可靠,也是十分推荐的用法)。

Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String item = iterator.next() ;
            if ("冥王星".equals(item)){
                iterator.remove();
            }
        }
        System.out.println(list);

结果如下,十分完美和正确:

[水星, 金星, 地球, 火星, 土星, 天王星, 海王星, 木星]

这是因为迭代器中的 remove 方法将期待修改的数量(expectedModCount)值进行了同步。

6:迭代器循环集合删除

(这个可能很多开发者也会这样写,也可能会抛出异常的)。

Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String item = iterator.next() ;
            if ("冥王星".equals(item)){
                list.remove(item);
            }
        }
        System.out.println(list);

 结果如下:

7:Stream filter 过滤

(十分推荐,当然使用这个删除需要JDK的环境在8及其8以上的版本)。

list = list.stream().filter(item -> !"冥王星".equals(item)).
 collect(Collectors.toList());
 System.out.println(list);

 结果如下,十分完美和正确:

这个方法利用了 Stream 的筛选功能,快速过滤所需要的元素,虽然不是进行集合删除,但达到了同样的目的,这种方法要更简洁

看了上面的几个例子,相信你熟悉了List删除元素的用法了,希望你看了上面的例子,开发的时候不会再犯错了。。。。

总结

到此这篇关于Java如何从List中删除元素的正确用法的文章就介绍到这了,更多相关Java从List中删除元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解Java虚拟机_动力节点Java学院整理

    深入理解Java虚拟机_动力节点Java学院整理

    虚拟机是一种抽象化的计算机,通过在实际的计算机上模拟各种计算机功能来实现的,下面通过本文给大家分享Java虚拟机相关知识,感兴趣的朋友一起看看吧
    2017-06-06
  • Java语法之 Java 的多态、抽象类和接口

    Java语法之 Java 的多态、抽象类和接口

    上节介绍了 Java 基础语法之解析 Java 的包和继承,如果这类知识有点疑惑的小伙伴,可以去 Java 的包和继承 这章看看,或许可以帮你解决一些疑惑哟!今天这篇文章我们将讲解的是 Java 的多态、抽象类和接口,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • Lucene单值编码压缩算法源码解析

    Lucene单值编码压缩算法源码解析

    这篇文章主要为大家介绍了Lucene单值编码压缩算法源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java String相加底层原理分析

    Java String相加底层原理分析

    这篇文章主要介绍了Java String相加底层原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java中难理解的四个概念

    Java中难理解的四个概念

    这篇文章主要介绍了匿名内部类、多线程、如何实现同步、序列化,这四个难理解的概念,同学们一定要仔细看看
    2021-04-04
  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    Spring Boot中自定义注解结合AOP实现主备库切换问题

    这篇文章主要介绍了Spring Boot中自定义注解+AOP实现主备库切换的相关知识,本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需要的朋友可以参考下
    2019-08-08
  • 10中java常见字符串操作实例

    10中java常见字符串操作实例

    给大家分享10中java常见字符串操作方法以及相关实例代码,对此有需要的读者们可以学习参考下。
    2019-07-07
  • Java平闰年判断的方法总结

    Java平闰年判断的方法总结

    本篇文章给大家整理了Java平闰年判断的两种方法,大家在写程序的时候如果用的到参考下吧。
    2018-02-02
  • 一文带你掌握Java ReentrantLock加解锁原理

    一文带你掌握Java ReentrantLock加解锁原理

    这篇文章将为大家详细介绍一下Java中ReentrantLock 加锁和释放锁的原理,以及和 Synchronized 的对比。文中的示例代码讲解详细,希望对大家有所帮助
    2022-12-12
  • javaweb中Http协议详解

    javaweb中Http协议详解

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。这篇文章主要为大家详细介绍了javaweb中的Http协议,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论