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


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


相关文章
|
4月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
281 100
|
4月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
312 101
|
4月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
135 4
|
3月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
112 7
|
4月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
292 5