java的copyAndWriteList的使用

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

遇到ArrayList问题是在项目中遇到的,当我要实现的功能:在一个list当中把一个元素从中间移到末尾,如下面例子:

 // 测试ArrayList
    @Test
    public void TestListDemo() {
        List<Person> list = new ArrayList<>();

        Person person1 = new Person("zhangyu", "123", 23);
        Person person2 = new Person("tangtuo", "123", 23);
        Person person3 = new Person("zhangmin", "456", 21);

        list.add(person1);
        list.add(person2);
        list.add(person3);

        for (Person p : list) {
            if (p.getUserName().equals("zhangyu")) {
                list.remove(p);
                list.add(p);
            }
        }

        System.out.println(list);
    }

这个例子出现问题,报错误为:

java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
	at java.util.ArrayList$Itr.next(ArrayList.java:859)
	at com.zhang.jdk8demo.StreamTest.TestListDemo(StreamTest.java:149)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

出现了并发包异常,需要这么做:

  // 测试copyAndWriteList
    @Test
    public void TestCopyAndWriteListDemo() {
        List<Person> list = new CopyOnWriteArrayList();

        Person person1 = new Person("zhangyu", "123", 23);
        Person person2 = new Person("tangtuo", "123", 23);
        Person person3 = new Person("zhangmin", "456", 21);

        list.add(person1);
        list.add(person2);
        list.add(person3);

        for (Person p : list) {
            if (p.getUserName().equals("zhangyu")) {
                list.remove(p);
                list.add(p);
            }
        }

        System.out.println(list);
    }

要这样才不会出现误差,在读的时候可以进行写入了,就实现了取出一个元素放到末尾的实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章