Java list移除元素相关操作指南

 更新时间:2024年12月25日 11:07:51   作者:烟雨江南不见卿  
这篇文章主要给大家介绍了关于Java list移除元素相关操作的相关资料,文中介绍的方法包括增强for循环、迭代器、Stream流和removeIf()方法,同时还介绍了如何从一个列表中删除包含另一个列表元素的方法,以及如何删除指定下标位置的元素,需要的朋友可以参考下

1.删除指定元素(四种方法)

(1)增强for(避免java.util.ConcurrentModificationException异常)

//如删除能够整除3的元素
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
System.out.println(list);
for (Integer integer : new ArrayList<>(list)) {
    if (integer % 3 == 0){
        list.remove(integer);
       }
    }
//删除后:
System.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

注意:上述代码中删除元素时,我遍历时创建了集合对象的副本,对副本进行遍历,对原数组进行了删除,这是一种方式,没法直接遍历list并删除,那样会出现以下错误:

D:\java\jdk1.8.0_321\bin\java.exe "-javaagent:D:\softlocation\idea 2019\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=51701:D:\softlocation\idea 2019\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
	at java.util.ArrayList$Itr.next(ArrayList.java:861)
	at com.sh.mu.script.logic.system.Likou.LiKouTest.main(LiKouTest.java:49)

java.util.ConcurrentModificationException 是 Java 中的一个运行时异常,它发生在我们试图在单线程的环境下修改一个集合对象的同时,另一个线程也在修改同一个集合对象时。

为了避免这个异常,我们有以下几种解决方案:

1.在单线程环境下,使用 Iterator 的 remove() 方法删除元素,而不是直接修改集合对象。

2.在多线程环境下,使用线程安全的集合类,如 ConcurrentHashMap、CopyOnWriteArrayList 等。

3.在单线程环境下,创建集合对象的副本,对副本进行修改操作。

4.使用 Java 8 的 Lambda 表达式和流操作,而不是显式使用迭代器。

(2)迭代器

//如删除能够整除3的元素
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10));
        //删除前:
System.out.println(list);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
  Integer next = iterator.next();
    if (next % 3 ==0){
      iterator.remove();
    }
 }
//删除后:
System.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

(3)stream流

//如删除能够整除3的元素
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
System.out.println(list);
List<Integer> integers = list.stream().filter(e -> e % 3 != 0).collect(Collectors.toList());

for (Integer integer : new ArrayList<>(list)) {
   if (integer % 3 == 0){
      list.remove(integer);
    }
 }
//删除后:
System.out.println(integers);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

(4)removeIf()

//如删除能够整除3的元素
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
System.out.println(list);
list.removeIf(integer -> integer % 3 == 0);
//删除后:
System.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

2.从list2中删除包含list1的元素

(1)for循环

注意遍历和删除不能操作同一数据,避免并发修改带来的问题。

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6));
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));

//删除前
System.out.println("list1元素:" + list1);
System.out.println("list2删除前:" + list2);
for (Integer integer : new ArrayList<>(list2)) {
    for (Integer integer1 : new ArrayList<>(list1)) {
        if (Objects.equals(integer, integer1)){
            list2.remove(integer1);
        }
    }

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(2)removeAll()

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6));
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));
//删除前
System.out.println("list1元素:" + list1);
System.out.println("list2删除前:" + list2);
list2.removeAll(list1);
System.out.println("list2删除后:" + list2);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(3)removeIf()

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6));
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));
//删除前
System.out.println("list1元素:" + list1);
System.out.println("list2删除前:" + list2);
  list2.removeAll(list1);
list2.removeIf(list1::contains);
System.out.println("list2删除后:" + list2);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(4)stream流

使用Java8及以上版本的Stream API:首先利用stream()获取流,然后使用filter过滤掉不需要的元素,最后使用collect方法收集结果。

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6));
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));
//删除前
System.out.println("list1元素:" + list1);
System.out.println("list2删除前:" + list2);
List<Integer> collect = list2.stream().filter(e -> !list1.contains(e)).collect(Collectors.toList());
System.out.println("list2删除后:" + collect);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

3.删除指定下标元素

(1)remove(index)方法

这是List接口提供的一个方法,可以直接删除指定下标位置的元素,使用此方法,需要传要删除的元素下标。

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));
System.out.println("list删除前:" + list);
//删除list下标为1的元素
list.remove(1);
System.out.println("list删除后:" + list);

结果:

list删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list删除后:[1, 3, 1, 2, 3, 4, 5]

(2)subList(int fromIndex,int toIndex)方法

如:删除下表1到3的元素:该方法返回源列表的一个子列表,包含从fromIndex(包含)到toIndex(不包含)之间的所有元素。如果fromIndex和toIndex相同,则返回一个空的子列表。

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5));
System.out.println("list删除前:" + list);
//删除下标为1到3的元素
list.subList(1,3).clear();
System.out.println("list删除后:" + list);

结果:

list删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list删除后:[1, 1, 2, 3, 4, 5]

总结

到此这篇关于Java list移除元素相关操作指南的文章就介绍到这了,更多相关Java list移除元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java并发编程StampedLock高性能读写锁详解

    java并发编程StampedLock高性能读写锁详解

    这篇文章主要为大家介绍了java并发编程StampedLock高性能读写锁的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java的抽象方法和抽象类实例详解

    Java的抽象方法和抽象类实例详解

    这篇文章主要介绍了Java的抽象方法和抽象类,结合实例形式详细分析了java抽象方法和抽象类的相关原理、使用方法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java使用BigDecimal精确运算浮点数

    Java使用BigDecimal精确运算浮点数

    这篇文章主要介绍了Java使用BigDecimal精确运算浮点数,帮助大家更好的处理浮点数数据,感兴趣的朋友可以了解下
    2020-10-10
  • Java DelayQueue实现延时任务的示例详解

    Java DelayQueue实现延时任务的示例详解

    DelayQueue是一个无界的BlockingQueue的实现类,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。本文就来利用DelayQueue实现延时任务,感兴趣的可以了解一下
    2022-08-08
  • 手写redis@Cacheable注解 参数java对象作为key值详解

    手写redis@Cacheable注解 参数java对象作为key值详解

    这篇文章主要介绍了手写redis@Cacheable注解 参数java对象作为key值详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 使用Spring的ApplicationEvent实现本地事件驱动的实现方法

    使用Spring的ApplicationEvent实现本地事件驱动的实现方法

    本文介绍了如何使用Spring的ApplicationEvent实现本地事件驱动,通过自定义事件和监听器,实现模块之间的松耦合,提升代码的可维护性和扩展性。同时还介绍了异步事件和事件传递的相关知识
    2023-04-04
  • interrupt()和线程终止方式_动力节点Java学院整理

    interrupt()和线程终止方式_动力节点Java学院整理

    线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身
    2017-05-05
  • Java经典用法总结(二)

    Java经典用法总结(二)

    这篇文章主要介绍了Java经典用法总结,在本文中,尽量收集一些java最常用的习惯用法,特别是很难猜到的用法,本文重点讲解了java应用和输入输出常用方法,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java+Swing实现医院管理系统的完整代码

    Java+Swing实现医院管理系统的完整代码

    这篇文章主要介绍了Java+Swing实现医院管理系统的完整代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • java equals和=,==的区别详细介绍

    java equals和=,==的区别详细介绍

    这篇文章主要介绍了java equals和=,==的区别,学习Java的朋友对equals 和== 这个概念开始使用的时候会有疑问,很难辨别如何正确使用,这里帮大家详细讲解该知识点,希望大家能掌握,有需要的小伙伴可以参考下
    2016-10-10

最新评论