详解Java中List的正确的删除方法

网友投稿 403 2022-07-29


目录简介实例正确方法法1:for的下标倒序遍历法2: list.stream().filter().collect()法3: iterator迭代器错误方法法1:for(xxx : yyy)遍历法2:for的下标正序遍历原因分析

简介

本文介绍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 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 list) {

// 待填充

}

}

正确方法

法1:for的下标倒序遍历

private static void removeB(List 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 list) {

List 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 list) {

Iterator 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 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 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 list = new ArrayList<>();

public static void main(String[] args) {

reset();

// method1();

// method2();

// mehttp://thod3();

// 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.remhttp://ove(0);

}

System.out.println(list);

}

}

以上就是详解Java中List的正确的删除方法的详细内容,更多关于Java List删除方法的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Java编写简易的算式测试程序
下一篇:关于JVM翻越内存管理的墙
相关文章

 发表评论

暂时没有评论,来抢沙发吧~