在Java中,有些场景需要遍历集合中的元素,然后根据条件进行删除元素的操作。如果使用传统的for循环遍历方式来删除元素,很可能出错或发生意想不到的问题。推荐使用迭代器iterator完成
1. 推荐使用迭代器方式****删除
阿里规约:【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
@Testvoid testList2(){List<String> list = new ArrayList<String>();list.add("1");list.add("2");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String item = iterator.next();if ("2".equals(item)) {iterator.remove();}}System.out.println(list);}
2. 尽量不要使用for循环遍历删除,否则很可能出问题。
因为删除元素后,数组元素发生前移,后续遍历可能导致
- 数组访问越界错误:元素减少,但是size()没有变,(可改成for里使用list.size())
- 有元素没遍历到
@Testvoid testList(){List<String> list = new ArrayList<String>();list.add("1");list.add("2");for (String item : list) {if ("2".equals(item)) {list.remove(item);}}System.out.println(list);}//或@Testvoid testList2(){List<String> list = new ArrayList<String>();list.add("1");list.add("2");int size = list.size();for (int i=0; i<size; i++) {if ("2".equals(list.gei(i))) {list.remove(i); }}System.out.println(list);}
3. 如果非要使用这种的话,可以使用倒序遍历删除,这样即使发生元素移动,不影响前面的元素
@Testvoid testList3(){List<String> list = new ArrayList<String>();list.add("1");list.add("2");for (int i=list.size()-1; i>=0; i--) {if ("2".equals(list.gei(i))) {list.remove(i); }}System.out.println(list);}