Java开发规范02 - 集合篇_ArrayList#subList 坑

举报
小工匠 发表于 2021/09/09 23:46:23 2021/09/09
【摘要】 文章目录 Arrays.subList 规则Code基本使用 注意事项修改原集合元素的值,会影响子集合修改原集合的结构,会引起ConcurrentModificationException异常...


在这里插入图片描述


Arrays.subList 规则

在这里插入图片描述

在这里插入图片描述


Code

基本使用

  /**
     * subList的注意事项
     */
    public static void  subList(){


        List<String> list = new ArrayList<>();
        list.add("小工匠");
        list.add("Java");
        list.add("AI");
        list.add("Big Data");
        list.add("LOT");

        // 基本使用
        List<String> targetList = list.subList(2, 3);

        System.out.println(list);
        System.out.println(targetList);

 

    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

基本使用很简单, 返回的是索引从fromIndex(包含)到 toIndex(不包含)的元素集合

在这里插入图片描述


注意事项

修改原集合元素的值,会影响子集合

非结构性修改】 举个例子,修改集合中的某个值

在这里插入图片描述

虽然我们只是修改了原集合list的值,但是影响到了子集合targetList。

在这里插入图片描述


修改原集合的结构,会引起ConcurrentModificationException异常

【结构性修改】举个例子往原集合list中添加一个元素

在这里插入图片描述

往原集合中添加了元素(结构性修改)后,在遍历子集合时,发生了ConcurrentModificationException异常。

注意事项:上述异常并不是在添加元素时发生的,而是在添加元素后,遍历子集合时发生的异常

正好对应

在这里插入图片描述

在这里插入图片描述


修改子集合元素的值,会影响原集合

非结构性修改】 修改下子集合targetList中某一元素的值,会影响到原集合中的值。

在这里插入图片描述

在这里插入图片描述


修改子集合的结构,会影响原集合

【结构性修改】往子集合targetList中添加一个元素 ,会影响原集合

在这里插入图片描述

在这里插入图片描述


源码解读

在这里插入图片描述

看下重点:

Returns a view of the portion of this list between the specified {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.

  
 
  • 1

返回指定的{@code fromIndex}(包含)和{@code toIndex}(排除)之间的列表部分的视图

视图嘛 ,对比对比数据库的视图,好理解一些

看下源码 java.util.ArrayList#subList

    public List<E> subList(int fromIndex, int toIndex) {
        subListRangeCheck(fromIndex, toIndex, size);
        return new SubList(this, 0, fromIndex, toIndex);
    }

  
 
  • 1
  • 2
  • 3
  • 4

重点看

 new SubList(this, 0, fromIndex, toIndex);

  
 
  • 1

在这里插入图片描述

可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。


小结

ArrayList的subList方法,返回的是原集合的一个子集合(视图),

  • 非结构性修改任意一个集合的元素的值,都会彼此影响,
  • 结构性修改原集合时,会报ConcurrentModificationException异常,
  • 结构性修改子集合时,会影响原集合

所以使用时要注意,避免程序错误或者异常。

在这里插入图片描述

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/115106766

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。