最近线上出了一个bug,竟然是List元素删除导致,这个本以为是常识,很基础的编码。可没想到还是会有新的开发同学出错。
错误的删除方式:for循环遍历集合,通过索引删除,看下面的错误❎演示:
List<String> list = new ArrayList<>(4); list.add("a"); list.add("b"); list.add("b"); list.add("c"); for (int i = 0; i <list.size(); i++) { if (list.get(i).equals("b")) { list.remove(i); } } System.out.println(list);运行结果为:[a, b, c]
以上代码是想删除集合中的“b”元素,然而并没有全部删除!
正确的操作方法:
方法1:
List<String> list = new ArrayList<>(4); list.add("a"); list.add("b"); list.add("b"); list.add("c"); Iterator<String> it = list.iterator(); while (it.hasNext()){ String s = it.next(); if (s.equals("b")){ it.remove(); } } System.out.println(list);
方法2: 一行搞定
List<String> list = new ArrayList<>(4); list2.add("a"); list2.add("b"); list2.add("b"); list2.add("c"); list = list.stream().filter(f -> !f.contains("b")).toList(); System.out.println(list);
方法3:一行搞定
List<String> list = new ArrayList<>(4); list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.removeIf(s -> s.equals("b")); System.out.println(list);
以上三种方法,都没有问题,可以挑喜欢的用。
本文讨论了一个常见的编程错误,即在遍历List时通过索引删除元素导致的bug。错误的示例代码展示了一种不推荐的做法,即在for循环中删除元素,这将导致元素未被完全删除。文章提供了三种正确的方法来解决这个问题:1) 使用Iterator进行删除;2) 一行代码利用Stream API过滤;3) 利用List的removeIf方法。这些方法确保了集合遍历和删除的正确性。
3411

被折叠的 条评论
为什么被折叠?



