1.删除代码
List<String> list = new ArrayList<>(); list.add("1111"); list.add("222"); list.add("333"); list.add("222"); list.add("222"); System.out.println(list.toString()); //1.错误 /*for (int i=0;i<list.size();i++){ if (list.get(i).equals("222")){ list.remove(i); } } System.out.println(list.toString());*/ //2.正确 /*for (int i=0;i<list.size();i++){ if (list.get(i).equals("222")){ list.remove(i--); } } System.out.println(list.toString());*/ //3.倒序删除,正确 /*for (int i = list.size() - 1; i >= 0; i--) { if (list.get(i).equals("222")) { list.remove(i); } } System.out.println(list.toString());*/ //4.正确做法 Iterator<String> it = list.iterator(); while (it.hasNext()) { if (it.next().equals("222")) { it.remove(); } } System.out.println(list);
实际原因:
为什么元素3只删除了一个?本以为这代码再简单不过,可还是掉入了陷阱里,上面的代码这样写的话,元素3是过滤不完的。只要list中有相邻2个相同的元素,就过滤不完。List调用remove(index)方法后,会移除index位置上的元素,index之后的元素就全部依次左移,即索引依次-1要保证能操作所有的数据,需要把index-1,否则原来索引为index+1的元素就无法遍历到(因为原来索引为index+1的数据,在执行移除操作后,索引变成index了,如果没有index-1的操作,就不会遍历到该元素,而是遍历该元素的下一个元素)。
参考: