一、错误使用场景
1、普通for循环遍历List删除指定元素,list.remove(index)
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); for (int i = 0; i < nameList.size(); i++) { String name = nameList.get(i); System.out.println("当前遍历对象==="+name); if (name.startsWith("张")) { nameList.remove(i); } } System.out.println(nameList);
List调用remove(index)方法后,会移除index位置上的元素,之后的所有元素依次前移,当移除完【张三】时,【李四】变成了数组的第一位,此时的索引应该要index-1才能获取到【李四】。所以每移除一个元素时就需要把index-1,否则原来索引为index+1的元素就无法遍历到。
示例:同上
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); for (String name : nameList) { System.out.println("当前遍历对象==="+name); if (name.startsWith("张")) { nameList.remove(name); } } System.out.println(nameList);
输出结果:
foreach循环实际上是迭代,使用list.remove(item)方法后,list 对象的modCount值进行了修改,而 list对象的迭代器中的expectedModCount值没有修改,所以抛出了异常
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张三"); nameList.add("张三"); nameList.remove("张三"); System.out.println(nameList);
输出结果:[李四, 王五, 赵六, 张三, 张三]
原因分析:
list.remove(object)的逻辑和list.remove(index)大致相同:元素依次遍历,数组中存在与入参对象相等的元素就移除,之后的所有元素依次前移,返回true,若不存在与入参相等的元素,返回false。
二、正确使用方法
removeIf()的入参是一个过滤条件,用来判断需要移除的元素是否满足条件。
原理:方法中设置了一个removeSet,把满足条件的元素索引坐标都放入removeSet,然后统一对removeSet中的索引进行移除
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); nameList.removeIf(o->o.startsWith("张")); System.out.println(nameList);
输出结果:[李四, 王五, 赵六]
示例:同上
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); Iterator<String> iterator = nameList.iterator(); while (iterator.hasNext()) { if (iterator.next().startsWith("张")) { iterator.remove(); } } System.out.println(nameList);
输出结果:[李四, 王五, 赵六]
定义一个需要移除的数组,for循环内将需要移除的元素收集在定义的数组中,for循环结束后直接removeAll()
示例:同上
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); List<String> removeList = new ArrayList<>(); for (String name : nameList) { if (name.startsWith("张")) { removeList.add(name); } } nameList.removeAll(removeList); System.out.println(nameList);
输出结果:[李四, 王五, 赵六]
示例:
List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("张八"); for (int i = nameList.size() - 1; i >= 0; i--) { String name = nameList.get(i); System.out.println("当前遍历对象===" + name); if (name.startsWith("张")) { nameList.remove(i); } } System.out.println(nameList);
输出结果:
三、总结
原文地址:https://blog.csdn.net/anxin_hw/article/details/128312846
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_47188.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!