package com.workit.demo.array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
/**
* @author:
* @Date: 2020/6/9
* @Description:
*/
public class ArrayListDelete {
public static void main(String[] args) {
Predicate predicate = p -> p.equals("a") || p.equals("b");
// 可以正常删除结果正确
deleteByIterator(getList(), predicate);
// 可以正常删除结果正确
deleteByReverseOrder(getList(), predicate);
// 可以删除 结果不正确
deleteByOrder(getList(), predicate);
// 不能删除 报错java.util.ConcurrentModificationException
deleteByArrayList(getList(), predicate);
// 不能删除 报错java.util.ConcurrentModificationException
deleteByForeach(getList(), predicate);
//不能删除 报错 java.util.ConcurrentModificationException
deleteByEnhancedForLoop(getList(), predicate);
// 正常删除数据
deleteAll(getList(), predicate);
}
public static List getList() {
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
return list;
}
/**
* 普通for循环倒序删除
* 可以正常删除 结果正确
* @param list
* @param predicate
*/
public static void deleteByReverseOrder(List list, Predicate 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循环正序删除
*可以删除 结果不正确
* @param list
* @param predicate
*/
public static void deleteByOrder(List list, Predicate 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());
}
/**
* 迭代器循环,使用ArrayList的remove()方法删除
* 可以删除 结果不正确
* @param list
* @param predicate
*/
public static void deleteByArrayList(List list, Predicate predicate) {
Iterator 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());
}
/**
* 迭代器循环,使用迭代器的remove()方法删除
* 可以正常删除结果正确
* @param list
* @param predicate
*/
public static void deleteByIterator(List list, Predicate predicate) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if (predicate.test(iterator.next())) {
iterator.remove();
}
}
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+":"+list.toString());
}
/**
* java8 forEach方法删除
*不能删除 报错 java.util.ConcurrentModificationException
* @param list
* @param predicate
*/
public static void deleteByForeach(List list, Predicate predicate) {
list.forEach(p -> {
if (predicate.test(p)) {
list.remove(p);
}
});
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+":"+list.toString());
}
/**
* 增强版for循环删除
*不能删除 报错 java.util.ConcurrentModificationException
* @param list
* @param predicate
*/
public static void deleteByEnhancedForLoop(List list, Predicate predicate) {
for (String string : list) {
if (predicate.test(string)) {
list.remove(string);
}
}
}
}
/**
* 调用批量删除方法
* @param list
* @param predicate
*/
public static void deleteAll(List list, Predicate predicate) {
List 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());
}