当前位置: 代码迷 >> 综合 >> 【Java基础知识】ArrayList怎么正确删除元素
  详细解决方案

【Java基础知识】ArrayList怎么正确删除元素

热度:16   发布时间:2024-01-28 09:12:53.0

先贴测试代码,以后再来总结

package com.wxw.list;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;/*** ArrayList的删除 坑** @Author: wxw* @create: 2020-07-14-22:53*/
public class ArrayList_Delete {public static void main(String[] args) {// 谓词 函数式接口Predicate<String> predicate = p -> p.equals("a") || p.equals("b");//1. 普通for循环倒序删除 可以正常删除 结果正确deleteByReverseOrder(getList(), predicate);//2. 迭代器循环,使用迭代器的remove()方法删除 可以正常删除结果正确deleteByIterator(getList(), predicate);//3.普通for循环正序删除 可以删除  结果不正确deleteByOrder(getList(), predicate);//4. 迭代器循环,使用ArrayList的remove()方法删除 报错java.util.ConcurrentModificationExceptiondeleteByArrayList(getList(), predicate);//5.java8 forEach方法删除 删除报错java.util.ConcurrentModificationExceptiondeleteByForeach(getList(), predicate);// 增强for循环删除 for-each()不能删除 报错 java.util.ConcurrentModificationExceptiondeleteByEnhancedForLoop(getList(), predicate);// 正常删除数据  deleteAll(getList(), predicate);}// 调用批量删除方法private static void deleteAll(List<String> list, Predicate<String> predicate) {List<String> removeList = new ArrayList<>();for (String string : list) {if (predicate.test(string)) {removeList.add(string);}}list.removeAll(removeList);System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}// 增强for循环删除 for-each()不能删除 报错 java.util.ConcurrentModificationExceptionprivate static void deleteByEnhancedForLoop(List<String> list, Predicate<String> predicate) {for (String string : list) {if (predicate.test(string)) {list.remove(string);}}}private static void deleteByForeach(List<String> list, Predicate<String> predicate) {list.forEach(p -> {if (predicate.test(p)) {list.remove(p);}});System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}/*** 迭代器循环,使用ArrayList的remove()方法删除  可以删除  结果不正确*/private static void deleteByArrayList(List<String> list, Predicate<String> predicate) {Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {if (predicate.test(iterator.next())) {list.remove(iterator.next());}}System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}private static void deleteByReverseOrder(List<String> list, Predicate<String> predicate) {for (int i = list.size() - 1; i >= 0; i--) {if (predicate.test(list.get(i))) {list.remove(list.get(i));}}System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}/*** 普通for循环正序删除 可以删除  结果不正确*/private static void deleteByOrder(List<String> list, Predicate<String> predicate) {for (int i = 0; i < list.size(); i++) {if (predicate.test(list.get(i))) {list.remove(list.get(i));}}System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}/*** 迭代器循环,使用迭代器的remove()方法删除 结果正确*/private static void deleteByIterator(List<String> list, Predicate<String> predicate) {Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {if (predicate.test(iterator.next())) {iterator.remove();}}System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString());}public static List<String> getList() {List<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");return list;}}

相关文章

  1. ArrayList的删除姿势你都掌握了吗