Java的List和Set集合的遍历删除

public class SetTest {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("张三");
        set.add("里斯");
        set.add("王五");
        set.add(null);
        //错误的方法
        for (String s : set) {
            if ("张三".equals(s)){
                set.remove(s);
            }
        }
    }
}

上述的遍历删除时会报一个java.util.ConcurrentModificationException异常

正确做法

方法1:
public class SetTest {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("张三");
        set.add("里斯");
        set.add("王五");
        set.add(null);
        //正确的做法
        while (iterator.hasNext()){
            String next = iterator.next();
            if ("张三".equals(next)){
                iterator.remove();
            }
        }
        set.forEach(System.out::println);
    }
}
方法2:
set.removeIf("张三"::equals);

其实方法2和方法1是一样的,看底层源码就知道了

default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
发布了141 篇原创文章 · 获赞 131 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_41621362/article/details/104111862
今日推荐