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异常,
  • 结构性修改子集合时,会影响原集合


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


相关文章
|
8天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
29 5
|
1月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
21天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
31 4
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
30 2
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
32 0
|
4月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
4月前
|
存储 Java 索引
Java 中 ArrayList 和 LinkedList 之间的区别
【8月更文挑战第22天】
133 1
|
7月前
|
存储 安全 Java
java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?
java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?
63 0
|
7月前
|
存储 安全 Java
[Java] 阿里一面~说一下ArrayList 与 LinkedList 区别
[Java] 阿里一面~说一下ArrayList 与 LinkedList 区别
159 1
下一篇
DataWorks