for循环遍历删除
使用for遍历删除的问题在于删除某元素后,List的大小变化了,会导致遍历时漏掉某些元素,例如在下面的代码中List的大小为6,删除第1个元素后第2次循环会访问原List中的第3个元素而不是第2个元素。
private void deleteElementInList(ArrayList<String> list,String e){
for (int i=0;i<list.size();i++){
if (list.get(i).equals(e)){
list.remove(i);
}
}
}
@Test
public void testDeleteElementInList() {
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "a", "c","a","b","c"));
deleteElementInList(list,"a");
for (String e:list){
System.out.println(e);
增强型for循环遍历删除
这种方式的问题在于删除元素后继续循环会触发ConcurrentModificationException异常,删除后马上break则不会触发异常。
private void deleteElementInList(ArrayList<String> list,String e){
for (String str:list){
if (str.equals(e)){
list.remove(str);
}
}
}
@Test
public void testDeleteElementInList() {
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "a", "c","a","b","c"));
deleteElementInList(list,"a");
for (String e:list){
System.out.println(e);
}
}
迭代器遍历删除
这种方式可以正常删除多个元素。
private void deleteElementInList(ArrayList<String> list,String e){
Iterator<String> iter=list.iterator();
while (iter.hasNext()){
String str=iter.next();
if (str.equals(e)){
iter.remove();
}
}
}
@Test
public void testDeleteElementInList() {
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "a", "c","a","b","c"));
deleteElementInList(list,"a");
for (String e:list){
System.out.println(e);
}
}