当前位置: 首页 > news >正文

Arrays.asList和ArrayList.subList

目录

asList使用add方法不受支持

subList子集原集互相影响

修改集合内容

修改集合结构

修改子集合的值

修改子集合结构

原因分析


分享两个东西,个人觉得比较容易踩坑的,也是下午的时候发现带的新人踩的坑

Arrays.asList和ArrayList.subList

asList使用add方法不受支持

我们先写一段这样的代码

    public static void main(String[] args) {

        List<Integer> sub = Arrays.asList(1, 2);
        System.out.println(sub);
        System.out.println(sub.contains(1));
        System.out.println(sub.contains(3));


    }

输出结果会是

true,false

这个很简单对吧

那,我们往这个sub里添加一个元素试试

可以看到,报错了

没有研究过的或者没有碰到过的,估计会懵一下,为啥只是一个简单的添加元素,但是不支持呢?

我们来看一下Arrays.asList的源码

它返回了一个ArrayList,看着是不是没问题,那,再看看这个ArrayList是个啥

你会发现,这个ArrayList是个Arrays的内部类,它也继承了AbstractList类,重写了很多方法,比如上面用的contains,但是,却没有重写add方法,所以在调用add方法的时候,会抛出java.lang.UnsupportedOperationException

subList子集原集互相影响

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");

        List<String> sub = list.subList(2, 4);
        System.out.println(list);
        System.out.println(sub);


    }

输出结果3和4,所以List的subList方法是左边包含右边不包含,这个很容易看出来

修改集合内容

我们修改一下子集

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");

        List<String> sub = list.subList(2, 4);
        System.out.println(list);
        System.out.println(sub);

        list.set(2, "33");
        System.out.println("list修改后的list" + list);
        System.out.println("list修改后的sub" + sub);


    }

可以看到,哪怕截取了子集合出来,原集合修改了,子集合也会被修改

修改集合结构

猜一下结果是什么

在修改了集合结构后,遍历子集合,会抛出异常

修改子集合的值

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");

        List<String> sub = list.subList(2, 4);
        System.out.println(list);
        System.out.println(sub);

        sub.set(0, "33");
        System.out.println("sub修改后的list" + list);
        System.out.println("sub修改后的sub" + sub);

    }

看,修改了子集合的值,会影响原集合

修改子集合结构

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");

        List<String> sub = list.subList(2, 6);
        System.out.println(list);
        System.out.println(sub);

        sub.add("7");
        System.out.println("sub添加后的list" + list);
        System.out.println("sub添加后的sub" + sub);

    }

原因分析

我们看一下sublist的源码

可以看到,new了一个sublist

从这儿可以得到,subList是ArrayList的一个内部类,并且构造函数里,没有创建新的list,所以修改原集合或者子集合的元素的值,是会相互影响的

ArrayList的subList方法,返回的是原集合的一个子集合(视图),非结构性修改任意一个集合的元素的值,都会彼此影响,结构性修改原集合时,会报ConcurrentModificationException异常,结构性修改子集合时,会影响原集合,所以使用时要注意

相关文章:

  • MySQL架构优化
  • python从入门到实践:软件开发目录规范
  • vue3新拟态组件库开发流程——loading组件源码
  • JS中新逻辑赋值运算符使用(?.、? ?、| |=、=)
  • 软考网络工程师需要哪些复习资料?
  • CIPT备考心得分享-下一个考过的就是你
  • 构建集团统一管控体系,低代码派上用场
  • iconfont 使用
  • 4.类的定义,变量类型,方法类型
  • pytorch中一些有关tensor的操作
  • 大数的乘法
  • DQL操作(数据库表数据查询操作)
  • linux共享内存
  • 小波神经网络的基本原理,小波神经网络什么意思
  • 被一位读者赶超,手摸手 Docker 部署 ELK Stack
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017届校招提前批面试回顾
  • crontab执行失败的多种原因
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • extjs4学习之配置
  • httpie使用详解
  • iOS | NSProxy
  • JavaScript 奇技淫巧
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Promise面试题2实现异步串行执行
  • Vue.js-Day01
  • vue的全局变量和全局拦截请求器
  • 关于for循环的简单归纳
  • 深度学习入门:10门免费线上课程推荐
  • 手写双向链表LinkedList的几个常用功能
  • 探索 JS 中的模块化
  • Semaphore
  • 阿里云服务器如何修改远程端口?
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # C++之functional库用法整理
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (13):Silverlight 2 数据与通信之WebRequest
  • (20050108)又读《平凡的世界》
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (Java)【深基9.例1】选举学生会
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (四)图像的%2线性拉伸
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Linq学习笔记
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Sql Server 保留几位小数的两种做法
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ../depcomp: line 571: exec: g++: not found
  • ./configure,make,make install的作用(转)
  • .gitignore
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter