Java list移除元素相关操作指南
作者:烟雨江南不见卿
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移除元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!