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

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

20210322233817564.png

Arrays.subList 规则


20210323002141481.png

20210323003042461.png


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);
    }


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


20210323004122303.png

注意事项


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


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


20210323005009611.png


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


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

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


20210323005408689.png


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

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

正好对应

20210323003042461.png


20210323004352876.png


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


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


20210323010051776.png


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

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

20210323005923791.png


源码解读


20210323010314714.png


看下重点:

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


返回指定的{@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);
    }

重点看

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


20210323010647985.png


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


小结


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

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


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


目录
打赏
0
0
0
0
99
分享
相关文章
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
83 3
|
27天前
|
Java LinkedList集合的深度剖析
总的来说,我希望像说故事一样讲解Java LinkedList集合的使用和实现原理,让有些许枯燥的编程知识变得趣味盎然。在这个“公交车”故事中,你不仅熟悉了LinkedList集合的实现和使用,而且还更深入地理解了数据结构中的链表。链表可能会因为插入和删除的便利性而被选用,虽然它的查找效率并不高,但是在很多场景中仍然十分有效。这就像公交车,虽然它速度不快,但却是城市出行的重要工具。
47 8
|
21天前
|
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
48 0
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
List中subList方法抛出异常java.util.ConcurrentModificationException原理分析
List中subList方法抛出异常java.util.ConcurrentModificationException原理分析
208 0
List中subList方法抛出异常java.util.ConcurrentModificationException原理分析
|
3月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
215 60
【Java并发】【线程池】带你从0-1入门线程池
|
23天前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
58 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
104 23

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等