案例
将list中 姓李的 全部删除掉
java.util.List<String> list=new ArrayList();
list.add("杨洋");
list.add("李四");
list.add("鹿晗");
list.add("李雷");
list.add("李现");
方式一(不能删除干净)
通过for语句循环
for(int i=0;i<list.size();i++){
String e=list.get(i);
if(e.startsWith("李")){
list.remove(e);
}
}
System.out.println(list);
执行结果:
[吴亦凡, 鹿晗, 李现]
因为删除 姓李的,导致 list.size() 长度变短,不会循环到最后一次
方式二(报错)
为了改上面的bug,将 list.size() 单独拿出来,如下:
int size=list.size();
System.out.println("size:"+size);
for(int i=0;i<size;i++){
String e=list.get(i);
if(e.startsWith("李")){
list.remove(e);
}
}
执行报错如下:
size:5
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
list长度原本是 5,因为删除 姓李的,此时list中只有3个元素,当循环第4次时会报错
方式二(修复上面bug)
为了修复上面的bug,移除数据后,size--,i--
int size=list.size();
System.out.println("size:"+size);
for(int i=0;i<size;i++){
String e=list.get(i);
if(e.startsWith("李")){
list.remove(e);
size--;
i--;
}
}
System.out.println(list);
方式三(报错)
for(String e:list){
if(e.startsWith("李")){
list.remove(e);
}
}
执行报错:
Exception in thread "main" java.util.ConcurrentModificationException
在for each循环中,修改list会报错
方式三(推荐)
从后向前循环,元素相同就删除,但i减小,所以不会引发list越界
for(int i=list.size()-1;i>=0;i--){
String e=list.get(i);
if(e.startsWith("李")){
list.remove(e);
}
}
System.out.println(list);
方式四(推荐)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String value = it.next();
if (e.startsWith("李")) {
it.remove();
}
}