进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题

这篇具有很好参考价值的文章主要介绍了进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

        1.0 集合的并发修改问题

                1.1 如何解决集合的并发修改问题

        2.0 Collcetions 工具类的说明


        1.0 集合的并发修改问题

        我们可以简单的认为,就是使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。

代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Abnormal {
    public static void main(String[] args) {

        //创建对象,再添加数据
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("陈七");
        list.add("李麻子");
        list.add("李四");
        list.add("王五");
        //利用迭代器进行遍历,先创建迭代器
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String a = iterator.next();
            if (a.contains("李")){
                list.remove(a);
            }
        }
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

       

        像以上情况,一边遍历的时候去删除数据,直接会报错,原因是因为集合是一个可变的容器,每删一个数据,容器的大小都会改变,那么数据存放的位置也会相应的改变。迭代器遍历可能不好理解,我们就换成普通的 for 循环,但是两者的出现的 Bug 是一样的。

代码如下:

import java.util.ArrayList;
import java.util.List;

public class Text_For {
    public static void main(String[] args) {
        //创建对象,再添加数据
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("陈七");
        list.add("李麻子");
        list.add("李四");
        list.add("王五");

        for (int i = 0; i < list.size(); i++) {
            String a = list.get(i);
            if (a.contains("李")){
                list.remove(a);
            }
        }
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

        发现用 for 循环竟然不报错,原因可能是没有用迭代器遍历严谨吧,以上的两种代码的效果都是一样的,会出现 Bug ,就是本来要删除带 ”李“ 的名字,但是发现名字还有一个”李四“,没有被删除,那是什么原因呢?

        进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

        直接会把 ”李四“ 忽略掉,这就是这出现 Bug 的地方。

                1.1 如何解决集合的并发修改问题

        对于用普通的 for 循环来遍历的代码来说可以有两种方法;第一个方法就是每一次删除数据的时候,都要进行 i--; 第二方法就是从尾开始遍历。

代码如下:

第一种方法

import java.util.ArrayList;
import java.util.List;

public class Text_For {
    public static void main(String[] args) {
        //创建对象,再添加数据
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("陈七");
        list.add("李麻子");
        list.add("李四");
        list.add("王五");

        for (int i = 0; i < list.size(); i++) {
            String a = list.get(i);
            if (a.contains("李")){
                list.remove(a);
                i--;
            }
        }
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

        成功把”李四“也删除掉了。

第二种方法

import java.util.ArrayList;
import java.util.List;

public class Text_For {

    public static void main(String[] args) {
        //创建对象,再添加数据
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("陈七");
        list.add("李麻子");
        list.add("李四");
        list.add("王五");

        for (int i = list.size() - 1; i >= 0; i--) {
            String a = list.get(i);
            if (a.contains("李")){
                list.remove(a);
            }
        }
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

        一样也可以把”李四“删除掉。

        对于用迭代器来遍历的代码来说,只能把集合对象.remove(String str) 换成迭代器对象.remove()

代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Abnormal {
    public static void main(String[] args) {

        //创建对象,再添加数据
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("陈七");
        list.add("李麻子");
        list.add("李四");
        list.add("王五");
        //利用迭代器进行遍历,先创建迭代器
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String a = iterator.next();
            if (a.contains("李")){
                iterator.remove();
            }
        }
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

        也是可以的。

        对于增强 for 循环还有利用 Lambda 表达式的循环都不可以用来一边遍历集合,一边删除数据,无法解决集合的并发修改异常。

        2.0 Collcetions 工具类的说明

        是一个用来操作集合的工具类。

以代码为例来介绍具体的静态方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Text_Collections {
    public static void main(String[] args) {
        String s1 = "李四";
        String s2 = "张三";
        String s3 = "王五";
        String s4 = "张麻子";
        List<String> list = new ArrayList<>();

        //1. addAll() 为集合批量添加数据
        Collections.addAll(list,s1,s2,s3,s4);
        System.out.println(list);
        //输出结果为:[李四, 张三, 王五, 张麻子]

        //2. shuffle() 打乱list集合中的元素顺序
        Collections.shuffle(list);
        System.out.println(list);
        //输出结果为:[王五, 张麻子, 李四, 张三]

        //3. sort() 对list集合的元素进行升序排序
        Collections.sort(list);
        System.out.println(list);
        //输出结果为:[张三, 张麻子, 李四, 王五]

    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

         补充第三种方法,如果对自定的对象进行排序的话,默认的 sort 是会报错的,所以得自定义比较,创建一个比较器。

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Text_Collections {
    public static void main(String[] args) {
        Student s1 = new Student("张三",19);
        Student s2 = new Student("李四",33);
        Student s3 = new Student("王五",21);

        List<Student> list = new ArrayList<>();
        Collections.addAll(list,s1,s2,s3);
        //自定义,根据年龄进行排序
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge()- o2.getAge();
            }
        });
        System.out.println(list);
    }
}

运行结果如下:

进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题,java,python,windows

 文章来源地址https://www.toymoban.com/news/detail-726737.html



到了这里,关于进阶JAVA篇- Collcetions 工具类与集合的并发修改异常问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java入门7(异常处理,list集合)

    一般来讲,程序出现错误的时候,大致情况有三种: 语法错误 运行时错误,指的是各程序运行的时候,出现的一些没有想到的问题,比如除数为0,比如数组下标越界等等 逻辑错误,运行结果和与其结果不一致,俗称bug ⭐Java中的异常处理机制主要用于处理运行时错误 ​运行

    2024年02月03日
    浏览(25)
  • Java 进阶 -- 集合(二)

    注意:为了更好地理解本节中的概念,请阅读Lambda表达式和方法引用。 你用集合做什么 ?您不能简单地将对象存储在集合中,然后将它们留在那里。 在大多数情况下,使用集合来检索存储在集合中的项。 再次考虑Lambda表达式一节中描述的场景。假设您正在创建一个社交网络应

    2024年02月08日
    浏览(24)
  • Java基础 - 9 - 集合进阶(二)

    可变参数就是一种特殊形参,定义在方法、构造器的形参列表里,格式是: 数据类型…参数名称; 可变参数的特点和好处 特点: 可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它 好处: 常常用来灵活的接收数据         Collections是一个用

    2024年03月20日
    浏览(28)
  • Java-并发编程-进阶篇

    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码 但是在企业中往往并不能解决实际问题,例如: 1.synchronized在企业开发中会大大降低系统的性能,有什么解决方式,或者其他的替代方案 2.当线程被创建并启动以后,它既不

    2024年02月06日
    浏览(52)
  • Java 进阶(一)-- 并发

    Java Platform, Standard Edition (Java SE) 11 官网DEV JDK 11 Documentation Java基础-并发篇 Concurrency Java®语言规范(Java SE 11 Edition) Java教程是为JDK 8编写的。本页中描述的示例和实践没有利用以后版本中引入的改进,并且可能使用不再可用的技术。 计算机用户理所当然地认为他们的系统一次可

    2024年02月07日
    浏览(20)
  • Java笔记_13(集合进阶2)

    双列集合体系结构 : 双列集合的特点 : 双列集合一次需要存一对数据,分别为键和值 键不能重复,值可以重复 键和值是一一对应的,每一个键只能找到自己对应的值 键+值 这个整体我们称之为“ 键值对 ”或者“ 键值对对象 ”,在Java中叫做“ Entry对象 ” Map是双列集合

    2024年02月01日
    浏览(26)
  • Java遍历集合元素并修改

    结论:fori循环可以修改、删除、添加,但是要注意的是下标还是元素;增强for循环内,可以修改,不可以删除、添加。想要删除、添加,使用集合迭代器的删除、添加方法。 对List和Set的遍历,有四种方式,下面以ArrayList为例进行说明。 1.1 fori循环 使用普通for循环的遍历方式

    2024年02月06日
    浏览(27)
  • 进阶JAVA篇-深入了解 List 系列集合

    目录         1.0 List 类的说明          1.1 List 类的常用方法         1.2 List 集合的遍历方式         2.0 ArrayList 集合的底层原理        2.1 从 ArrayList 集合的底层原理来了解具有该特性的原因:          2.2 ArrayList 集合的优缺点         3.0 LinkedList 集合的底层原理  

    2024年02月08日
    浏览(48)
  • Java进阶篇--并发编程的优点&缺点

    目录 并发编程的优点缺点 为什么要使用并发编程(优点): 并发编程的缺点: 频繁的上下文切换 线程安全 易混淆的概念 阻塞与非阻塞 阻塞模型 非阻塞模型 同步与异步 同步调用 异步调用 临界区 并发与并行 上下文切换 并发编程是指在程序中同时执行多个独立的任务或操

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包