【遍历集合的时间修改一个List的方式】

遍历集合的时间修改一个List的方式

  • 废话篇
    • 第一种方式
    • 第二种方式
    • 第三种方式
    • 第四种方式
    • 第五种方式
    • 第六种方式

废话篇

我们知道,在foreach的同时修改集合,会触发fail-fast机制,要避免fail-safe机制,我们一起来看看有几种处理方案:

第一种方式

NO.1:通过普通的for循环实现

public void listRemove() {

    List<Student> students = new this.getStudent();
    
    for(int y=0;y<students.size();y++) {
        if(students.get(y).getId() %3 == 0) {
            Student stu = students.get(y);
            students.remove(stu);
            //做一次--,避免漏删
            y--;
        }
    }
}

第二种方式

NO.2:使用迭代器循环实现

public void iteratorRemove() {

    List<Student> students = this.getStudents();
    Iterator<Student> stuIter = students.iterator();
    while (stuIter.hasNext()) {
        Student student = stuIter .next();
        if(student.getId() %2 != 1) {
            /*
            * 这里要使用Iterator的remove方法移除当前对象;
            * 如果使用List的remove方法,则同样会出现					    ConcurrentModificationException
            */
            stuIter.remove();
        }
    }
}

第三种方式

NO.3:将原来的copy一份副本,遍历原来的List,然后删除副本(用到的是fail-safe机制)不清楚这个机制可以自行查阅我的博文关于fail-safe机制的解读。fail-safe机制详细解读

public void copyRemove() {

    //注意注意:这种方法的equals是需要我们重写的
    List<Student> students = this.getStudents();
    List<Student> studentsCopy = deepclone(students);
    for (Student student : students) {
        if(needDel(student)) {
            studentsCopy.remove(stu);
        }
    }
}

第四种方式

NO.4:使用并发安全的集合类 (Copy-On-Write)。不明白的小伙伴还是要去查阅fail-safe机制详细解读这篇文章。里面有讲到。

public void cowRemove() {

    List<String> students = new CopyOnWriteArrayList<>(this.getStudents);
    for(Student student : students) {
        if(needDel(student)) 
            students.remove(student);
    }
}

第五种方式

NO.5:通过Stream的过滤方法,因为Stream每次处理之后都会生成一个新的Stream,不存在并发问题,所以Stream的filter也可以修改list集合。
不知道Stream的小伙伴可以去查阅集合类的排序方式,这篇博文,我里面有说到Stream。

public List<String> streamRemove() {

    List<String> students = this.getStudents();
    return students.stream().filter(this::notNeeDel)
    .collect(Collectors.toList());
}

第六种方式

通过removeIf方法,实现元素的过滤删除操作。removeIf() 方法用于删除所有满足特定条件的数组元素。

arraylist.removeIf(this :: needDel);

OK,下一篇文章就要针对粉丝开放了哦,记得点个关注,随用随取,本号会陆续上来很多专栏。Java基础、JVM、集合类、Java并发、微服务、分布式、Kafka、RocketMQ、RabbitMQ、Zookeeper、ElasticSearch、高性能、高可用、高并发、本地缓存、分库分表、定时任务、DDD、日志、云计算、配置中心、Dubbo、Redis、Netty、MyBatis、MySQL、SpringCloud…。具有丰富的知识干货!

你可能感兴趣的:(Java集合类,list,数据结构)