Java集合安全删除常见操作

1,475 阅读1分钟
public class ListDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("11");
        list.add("22");
        list.add("22");
        list.add("33");
        list.add("44");
        System.out.println(list);
        //remove(list,"22");
        List list1 = copyOnWriteArrayListRemove(list, "22");
        System.out.println(list1);
    }  

常见错误


    //错误 java.util.ConcurrentModificationException 会产生并发问题
   	private static void remove(List<String> list, String s) {
        for (String s1 : list) {
            if(s.equals(s1)){
                list.remove(s1);
            }
        }
    }

    //错误 删除不完整 运行结果[11, 22, 33, 44] s="22"
    //(1)index 0   1   2   3   4
    //原因 由于[11, 22, 22, 33, 44]集合开始长度为5,当集合遍历到1时,item="22"进行删除该元素,
    //           (2)index       0   1   2   3
    // 并且该集合元素总体往前挪一位[11, 22, 33, 44] i=1 ===>> i++之后 i = 2;所以item得到的值 list.get(i)为"33"把第二个"22"给忽略掉
    private static void remove(List<String> list, String s) {
        for(int i = 0; i < list.size(); i++){
            String item = list.get(i);
            if(s.equals(item)){
                list.remove(item);
            }
        }
    }

正确操作(如下)


    //正确 运行结果[11, 33, 44]
    private static void remove(List<String> list, String s) {
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String s1 = iterator.next();
            if(s.equals(s1)){
                iterator.remove();
            }
        }
    }

    //正确 运行结果[11, 33, 44]
    private static void remove(List<String> list, String s) {
        for (int i = list.size() - 1; i >= 0; i--){
            String s1 = list.get(i);
            if (s.equals(s1)){
                list.remove(s);
            }
        }
    }

    //正确 java8 使用lambda表达式删除列表元素 运行结果[11, 33, 44]
    private static void remove(List<String> list, String s) {
        //lambda表达式的方法
       list.removeIf(e -> s.equals(e));
    }

    //正确 运行结果[11, 33, 44]
    private static List copyOnWriteArrayListRemove(List<String> list, String s){
        CopyOnWriteArrayList<String> cList = new CopyOnWriteArrayList<>(list);
        for (String s1 : cList) {
            if (s.equals(s1)){
                cList.remove(s1);
                //注意别这样删除,java.util.ConcurrentModificationException 会产生并发问题
                //list.remove(s1);
            }
        }
       return cList;
    }}