概述
一、ArrayList删除正确姿势概述
先贴测试代码,以后再来总结
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.ConcurrentModificationException
deleteByArrayList(getList(), predicate);
//5.java8 forEach方法删除 删除报错java.util.ConcurrentModificationException
deleteByForeach(getList(), predicate);
// 增强for循环删除 for-each()不能删除 报错 java.util.ConcurrentModificationException
deleteByEnhancedForLoop(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.ConcurrentModificationException
private 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) List 元素去重
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("redis");
list.add("rediss");
list.add("redis");
list.add("java");
list.add("redis");
list.add("c++");
list.add("redi");
list.add("redi");
list.add("redis");
list.add("java");
list.add("html");
list.add("aa");
list.add("c++");
// 方式一:使用HashSet删除ArrayList中重复的元素(元素顺序改变)
HashSet<String> hashSet = new HashSet<String>(list);
System.out.println(hashSet);
// 方式二:使用LinkedHashSet删除ArrayList中重复的元素(元素顺序不变)
HashSet<String> linkedHashSet = new LinkedHashSet<String>(list);
System.out.println(linkedHashSet);
// 方式三:创建一个新集合,遍历旧的集合,不包含就添加
ArrayList<String> newList = new ArrayList<String>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String obj = it.next();
if (!newList.contains(obj)) {
newList.add(obj);
}
}
System.out.println(newList);
// 方式四:用equals方法比较ArrayList中数据,遍历两次List即可
for (int i = 0; i < list.size(); i++) {
for (int j = 1 + i; j < list.size(); j++) {
if (list.get(i).toString().equals(list.get(j))) {
list.remove(j);
}
}
}
System.out.println(list);
}
相关文章
-
ArrayList的删除姿势你都掌握了吗
-
ArrayList去除重复元素
最后
以上就是激昂樱桃为你收集整理的【Java基础知识】ArrayList怎么正确删除元素的全部内容,希望文章能够帮你解决【Java基础知识】ArrayList怎么正确删除元素所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复