zoukankan      html  css  js  c++  java
  • 注意!在subList生成子列表之后,一定不要随便更改原列表

    大家好,我是雄雄。

    前几期我们说过,subList方法是返回原列表的子列表,并且我们还说过,在subList返回的子列表上操作时,会直接影响着原列表,原文在这里:

    subList?? subString???

    子列表只是原列表的一个视图

    那么,大家有没有想过这样一个问题,在调用subList方法返回子列表之后,我们要是不操作子列表,而是操作的原列表,会怎么样呢?

    下面我们先从一段代码上看起:

    public static void testSubList(){
        //初始化一个集合
        List<String> lists = new ArrayList<String>();
        //给集合中添加四个元素
        lists.add("A");
        lists.add("B");
        lists.add("C");
        lists.add("D");
        //遍历集合
        System.out.println("原来集合中的元素:");
        for (String str: lists) {
          System.out.print(str+" ");
        }
        System.out.println("\n子列表中的元素:");
        List<String>new_list = lists.subList(0, 2);
        
        for (String str: new_list) {
          System.out.print(str+" ");
        }
      }

    运行结果如下:

    这块代码很好理解,无外乎就是初始化了个集合,并添加了几个元素,通过subList方法返回了一个子列表,最后将两个列表中的元素都遍历出来。

    接下来我要改一下代码了,如下:

    public static void testSubList(){
        //初始化一个集合
        List<String> lists = new ArrayList<String>();
        //给集合中添加四个元素
        lists.add("A");
        lists.add("B");
        lists.add("C");
        lists.add("D");
        //遍历集合
        System.out.println("原来集合中的元素:");
        for (String str: lists) {
          System.out.print(str+" ");
        }
        System.out.println("\n子列表中的元素:");
        List<String>new_list = lists.subList(0, 2);
        
        for (String str: new_list) {
          System.out.print(str+" ");
        }
        //给原来的集合中新加一个元素
        lists.add("E");
        System.out.println("\n新加元素之后原来集合的元素:");
        for (String str: lists) {
          System.out.print(str+" ");
        }
        
        System.out.println("\n新加元素之后子列表中的元素:");
        for (String str: new_list) {
          System.out.print(str+" ");
        }
      }

    这段代码前面部分没有变,后面只是给原集合中新插入了一个元素“E”,然后对原集合以及子列表进行遍历,运行结果如下所示:

    居然报错了?并且是在原集合中新加元素之后遍历子列表时报的错。ConcurrentModificationException是并发修改异常,但是我们这里并没有多线程操作,何来并发异常?其实,原因很简单,那就是subList方法是原列表的子列表,当原来的集合(原列表)修改之后,subList取出的子列表并未跟着一起修改,也就是不会生成新列表,最后在最字列表操作时,程序就会发现修改计数器(Modification)与预期的不符合,故抛出此异常。

    因此,在subList生成子列表之后,一定不要随便更改原列表。

    往期精彩

    神奇!一行代码实现删除某集合下标20-30的元素

    2020-10-14

    ‘小会计’的转行之旅

    2020-10-13

    班级日常分享,一天一瞬间

    2020-10-14

    子列表只是原列表的一个视图

    2020-10-12

    “半路出家”的程序猿怎么不被“熊”

    2020-10-11

    某同学工作之后的感悟

    2020-10-10

    班级日常分享,一天一瞬间

    2020-10-10

    点分享

    点点赞

    点在看

  • 相关阅读:
    VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 【无插件版】(windows vista/7/8 x86/x64 )
    js中each的用法
    Math函数floor、round、ceil的区别
    JS中的prototype解析
    Ubuntu虚拟机搭建
    我的第一篇blog
    实验四+124+高小娟
    实验三+124+高小娟
    第5次作业+105032014124+高小娟
    第4次作业类测试代码+105032014124+高小娟
  • 原文地址:https://www.cnblogs.com/a1111/p/14877387.html
Copyright © 2011-2022 走看看