正确示例
1. 迭代器(推荐使用)
List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()){ if("2".equals(iterator.next())){ iterator.remove();; } } System.out.println("还剩余的元素:" + list);
2. for循环倒排删除(推荐使用)
List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); for (int i = list.size() - 1; i >= 0; i--) { if("1".equals(list.get(i))){ list.remove(i); } } System.out.println("还剩余的元素:" + list);
3. for循环删除(不推荐使用,代码语义性不强)
List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); for (int i = 0; i < list.size(); i++) { if("1".equals(list.get(i))){ list.remove(i); // 删除后重置下标,否则会漏删 i--; } } System.out.println("还剩余的元素:" + list);
错误用法
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); for (String item: list){ if("1".equals(item)){ list.remove(item); } } System.out.println("还剩余的元素:" + list);
上边执行没问题,把要删除的元素1改成2试试呢
或者用下边的list进行删除就会报错
List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); for (String item: list){ if("1".equals(item)){ list.remove(item); } } System.out.println("还剩余的元素:" + list);
如果集合中的元素唯一,也就是说只删除集合中符合条件的一个元素,以下用法也是没问题的
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); for (String item: list){ if("3".equals(item)){ list.remove(item); // 只删除一个就跳出 break; } } System.out.println("还剩余的元素:" + list);
总结:
【编码强制规约】在《阿里巴巴Java开发手册》中,针对集合操作,有一项规定:不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。