详解Java中List的正确的删除方法
作者:IT利刃出鞘 发布时间:2021-09-19 13:20:42
标签:Java,List,删除,方法
简介
本文介绍Java的List的正确的删除方法。
实例
需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉。即:填充removeB()方法
package com.example.a;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
removeB(list);
}
private static void removeB(List<String> list) {
// 待填充
}
}
正确方法
法1:for的下标倒序遍历
private static void removeB(List<String> list) {
for (int i = list.size() - 1; i >= 0; i--) {
if ("b".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list);
}
结果
[a, c, d]
法2: list.stream().filter().collect()
private static void removeB(List<String> list) {
List<String> newList = list.stream()
.filter(e -> !"b".equals(e))
.collect(Collectors.toList());
System.out.println(newList);
}
结果
[a, c, d]
法3: iterator迭代器
private static void removeB(List<String> list) {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) {
it.remove();
}
}
System.out.println(list);
}
结果
[a, c, d]
错误方法
法1:for(xxx : yyy)遍历
private static void removeB(List<String> list) {
for (String s : list) {
if ("b".equals(s)) {
list.remove(s);
}
}
System.out.println(list);
}
结果(报异常)
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.example.a.Demo.removeB(Demo.java:18)
at com.example.a.Demo.main(Demo.java:14)
法2:for的下标正序遍历
private static void removeB(List<String> list) {
for (int i = 0; i < list.size(); i++) {
if ("b".equals(list.get(i))) {
list.remove(list.get(i));
}
}
System.out.println(list);
}
结果(有的没有删除掉)
[a, b, c, d]
原因分析
需求:通过遍历把list集合的所有数据删除掉。
package com.example.a;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
private static List<String> list = new ArrayList<>();
public static void main(String[] args) {
reset();
// method1();
// method2();
// method3();
// method4();
}
private static void reset(){
list.clear();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
}
/**
* 方法一:遍历删除第i个元素(错误版)
* 执行结果:没有完全删除。打印结果:[b, d]
*/
/**
* 下面遍历操作过程如下:
* i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[b,c,d,e]
* i = 1 list.size() == 4 执行完第二次list.remove(1); list剩下[b,d,e]
* i = 2 list.size() == 3 执行完第三次list.remove(2); list剩下[b,d]
* i = 3 list.size() == 2 i > list.size()所以条件不满足,最后剩下[b,d]
*/
public static void method1() {
for (int i = 0; i< list.size(); i++) {
list.remove(i);
}
System.out.println(list);
}
/**
* 方法二:删除第0个元素(错误版)
* 执行结果:元素没有删除。打印结果:[d, e]
*/
/**
* 下面遍历操作过程如下:
* i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[b,c,d,e]
* i = 1 list.size() == 4 执行完第二次list.remove(0); list剩下[c,d,e]
* i = 2 list.size() == 3 执行完第三次list.remove(0); list剩下[d,e]
* i = 3 list.size() == 2 i > list.size()所以条件不满足,最后剩下[d,e]
*/
public static void method2() {
for (int i = 0; i< list.size(); i++) {
list.remove(0);
}
System.out.println(list);
}
/**
* 方法三:只取一次长度删除第i个(错误版)
* 执行结果:报错。打印结果:
* Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
*/
/**
* 只求取list.size()长度一次
* i == 0 len == 5 list.remove(0) list剩下[b,c,d,e]
* i == 1 len == 5 list.remove(1) list剩下[b, d,e]
* i == 2 len == 5 list.remove(2) list剩下[b, d]
* i == 3 len == 5 list.remove(3) list因为没有第四个元素,于是报索引越界错误
*/
public static void method3() {
int len = list.size();
for (int i = 0; i < len; i++) {
list.remove(i);
}
System.out.println(list);
}
/**
* 方法四:只取一次长度删除第0个(正确版)
* 执行结果:完全删除。打印结果:[]
*/
/**
* 下面遍历操作过程如下:
* i = 0 len == 5 执行完第一次list.remove(0); list剩下[b,c,d,e]
* i = 1 len == 5 执行完第二次list.remove(0); list剩下[c,d,e]
* i = 2 len == 5 执行完第三次list.remove(0); list剩下[d,e]
* i = 3 len == 5 执行完第四次list.remove(0); list剩下[e]
* i = 4 len == 5 执行完第五次list.remove(0); list剩下[]
*/
public static void method4() {
int len = list.size(); // 保证只获取一次长度
for (int i = 0; i< len; i++) {
list.remove(0);
}
System.out.println(list);
}
}
来源:https://blog.csdn.net/feiying0canglang/article/details/124853294
0
投稿
猜你喜欢
- 前言最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号。每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动
- WHY朋友在群里求助一个问题,问题原型是这样的:String str = "{{10.14, 11.24, 44.55, 41.0
- 场景我们团队现在面临着多端数据接口对接的问题,为了解决这个问题我们定义了接口对接的规范,前端(安卓,Ios,web前端)和后端进行了数据的格
- java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和
- 缓存淘汰算法在高并发、高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对。第一次请求时把计算好的结果存放在缓存中,下次遇到同样
- 1、概念首先我们理解一下,什么叫做完美数?问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数
- 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。经典题,不多说,直接上代码import java.
- MyBatis的注解实现复杂映射开发实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解
- 本文实例讲述了java实现变更文件查询的方法。分享给大家供大家参考。具体如下:自己经常发布包时需要查找那些文件时上次发包后更新的数据文件,所
- /** * @param h *
- 本文以一个简单的实例来说明C#策略模式的实现方法,分享给大家供大家参考。具体实现方法如下:一般来说,当一个动作有多种实现方法,在实际使用时,
- 今天,给大家分享一个Java后端利用Phantomjs实现生成图片的功能,同学们使用的时候,可以参考下!PhantomJS简介首先,什么是P
- /** * 实现 * @author dujinyang * */顺序是: OneAcitivity
- 本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及final关键字对初始化的影响。另外,还讨论了由于继承原因,
- 问题:Information:java: Errors occurred while compiling module &lsquo
- C#实现多态主要有3种方法,虚方法,抽象类,接口1 虚方法在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上over
- 如何配置 * step1: 自定义 * /** * 自定义 * */public class MyInterceptor implemen
- 上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMa
- 代理对象的生成方法是:Proxy.newProxyInstance(...) ,进入这个方法内部,一步一步往下走会发现会调用ProxyGen
- 1. 为什么要更改SpringBoot运行方式?Tomcat Connector(连接器)有三种运行模式:bio nio aprbio(bl