//创建对象
ArrayList<String> list = new ArrayList<>();
//添加元素
list.add("张三丰");
list.add("张翠山");
list.add("张无忌");
list.add("灭绝师太");
list.add("殷素素");
list.add("赵敏");
System.out.println("list = " + list);
for (int i = 0; i < list.size(); i++) {
String name = list.get(i);
if (name.startsWith("张")) {
//删除元素
list.remove(i);
}
}
本来想删除姓张的所有元素,但是运行结果如下
可以看到张翠山并没有删除,原因如下
那么简单来说就是数组在被删除元素后,后面的元素会自己往前顶,然后再才返回一个新的数组。等数组操作完毕后回到这里,指针往后移动一个,直接把刚刚顶过来的C给漏掉了,导致漏判!
解决方案如下:
//解决方案1 在删除后下标往回移动一个。
for (int i = 0; i < list.size(); i++) {
String name = list.get(i);
if (name.startsWith("张")) {
//删除元素
list.remove(i);
i--;
}
}
//解决方案2 倒序删除,比较稳妥,横竖漏不掉
for (int i = list.size() - 1; i >= 0; i--) {
String name = list.get(i);
if (name.startsWith("张")){
list.remove(i);
}
}