remove()方法有两种移除的方式:

1、根据下标移除,public E remove(int index)

2、根据内容移除,public boolean remove(Object o)

要注意自己调用的remove()方法中的,传入的是int类型还是一个对象。
List 删除元素的逻辑是将目标元素之后的元素往前移一个索引位置,最后一个元素置为 null,同时 size - 1;所以按照从大往小的方向删除不容易出错

java 中list进行动态remove处理
删除list元素的三种正确方法

错误的方式1

for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1) {  
       list.remove(i);  
    }  
}  

这样会抛出异常

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3  
    at java.util.ArrayList.RangeCheck(Unknown Source)  
    at java.util.ArrayList.get(Unknown Source)

原因:数组越界。删除元素之后未改变相应角标,遍历到最后一个的时候就会找不到,抛出这个异常。

错误的方式2

Iterator<Integer> iterator = list.iterator();  
while(iterator.hasNext()){  
    int i = iterator.next();  
    if(i == 1){  
       list.remove(i);      //错误,ConcurrentModificationException异常。
    }  
}

出现如下异常:

Exception in thread “main” java.util.ConcurrentModificationException 
at java.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.next(ArrayList.java:831) 
at com.ips.list.ArrayListRemove.remove31(ArrayListRemove.java:109) 

原因:执行 list.remove(item);对 list 对象的 modCount 值进行了修改,而 list 对象的迭代器的 expectedModCount 值未进行修改。因此抛出了ConcurrentModificationException异常。

正确做法1:删除下标以及定位到遍历位置

for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1){  
       list.remove(i);  
       len--;
       i--;
    }  
}

正确做法2:使用Java的Iterator接口来实现遍历

Iterator<Integer> iterator = list.iterator();  
while(iterator.hasNext()){  
    int i = iterator.next();  
    if(i == 1){  
        iterator.remove();  //正确
    }  
}

正确做法3:按照从大到小的顺序删除
//remove13和remove14完全一样,均可正确删除。

 public static void remove13(List<String> list, String target){
        int size = list.size();
        for(int i = size - 1; i >= 0; i--){
            String item = list.get(i);
            if(target.equals(item)){
                list.remove(item);
            }
        }
        print(list);
    }
public static void remove14(List<String> list, String target){
    for(int i = list.size() - 1; i >= 0; i--){
        String item = list.get(i);
        if(target.equals(item)){
            list.remove(item);
        }
    }
    print(list);
}

正确做法4:通过 CopyOnWriteArrayList 解决 List的并发问题

public static void remove22(ArrayList<String> list, String target) {
        final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);
        for (String item : cowList) {
            if (item.equals(target)) {
                cowList.remove(item);
            }
        }
        print(cowList);
    }   
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐