subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List。

让我们初始化一个例子:

import java.util.ArrayList;
import java.util.List; public class SubList_demo {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E"); List<String> subList = list.subList(0,2);
System.out.println(subList);
//ArrayList sub_list = list.subList(0,2); }
}

运行结果:

但是,subList方法得到的结果是不能转换成ArrayList,Vector,LinkedList等类型,实验如下:

很明显,当我们尝试将list转换成ArrayList时。报错了!!!!!!!

底层原理

  subList返回的是一个视图!!!!!!!!!

  subList并没有重新创建一个list,而是直接引用了原有的List(返回了父类的视图),只是指定了它要使用的元素的范围而已。

  那为什么subList方法得到的集合不能转换为ArrayList呢?原因在于subList只是ArrayList的内部类,它们之间并没有继承关系,所以无法直接进行继承关系的转换。

下面对于视图的概念做一个讲解!!!

  非结构性改变

import java.util.ArrayList;
import java.util.List; public class SubList_demo {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E"); List subList = list.subList(0,3); System.out.println("sourceList:" + list);
System.out.println("sourceList .subList(0,3) is :" + subList); subList.set(1,"FFF"); System.out.println("sourceList:" + list);
System.out.println("subList:" + subList); }
}

运行结果:

  当我们尝试通过set方法改变subList中某个元素的值时,发现,原来的那个List中的对应元素的值也发生了变化!!

  同理,如果使用同样的方法修改sourceList中的某个元素,那么subList中的对应的值也会发生改变!

  

  结构性改变

        List<String> list = new ArrayList<>();
list.add("AAAA");
list.add("BBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEE");
list.add("FFFF"); System.out.println("sourceList:" + list); List subList = list.subList(1,4); System.out.println("subList:" + subList); subList.add("666"); System.out.println("***************");
System.out.println("sourceList:" + list);
System.out.println("subList:" + subList);

运行结果:

  当对subList的末尾添加元素时,sourceList的结果也随之发生了改变!!!!

最后,如果对sourceList做修改的话,会抛出异常!!!!

为什么ArrayList的subList结果不能转换为ArrayList????的更多相关文章

  1. 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类

    关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...

  2. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  3. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法   1 2 String[] asset = {"equity", "stocks", "gold&q ...

  4. ArrayList的subList方法带来的坑

    最近在项目中遇到了一个问题,由一个对象序列化的结构,在反序列化时一直提示失败,真的百思不得其解啊.在对问题排查了好久之后,才发现是这个序列化的对象中的list调用了ArrayList的sublist方 ...

  5. 为什么要谨慎使用Arrays.asList、ArrayList的subList?

    1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List<Integer> statusList = Arrays.asL ...

  6. 【Java 基础】Arrays.asList、ArrayList的subList注意事项

    1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List<Integer> statusList = Arrays.asL ...

  7. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  8. ArrayList 源码分析和自定义ArrayList实现

    概述 ArrayList 是基于数组实现的,是一个能自动扩展的动态数组. ArrayList 是线程不安全的,多线程情况下添加元素会出现数组越界的情况,而且数组赋值操作不是原子操作,会导致多线程情况下 ...

  9. ArrayList的sublist注意

    void testArrayList(){ String []appname ={"联系人","相机","电话","收音机&quo ...

随机推荐

  1. raspberry pi使用笔记

    1.raspberry pi系统vim问题 习惯了Linux的vim的使用,但是在raspberry pi中,用apt-get install vim后,vim变得很难用,进入编辑模式,输入字母时会莫 ...

  2. ExpressionChangedAfterItHasBeenCheckedError详细解释

    一个angular组件,他的生命周期是这样的 update bound properties for all child components/directives call ngOnInit, On ...

  3. WebWorker:工作者线程初探

    WebWorker:工作者线程初探 参考资料: 1.Web Worker 使用教程 - 阮一峰:http://www.ruanyifeng.com/blog/2018/07/web-worker.ht ...

  4. vue2与vue3实现响应式的原理区别和提升

    区别: vue2.x: 实现原理: 对象类型:Object.defineProperty()对属性的读取,修改进行拦截(数据劫持): 数组类型:通过重写更新数组的一系列方法来进行拦截(对数组的变更方法 ...

  5. Apache DolphinScheduler ASF 孵化器毕业一周年,汇报来了!

    不知不觉,Apache DolphinScheduler 已经从 Apache 软件基金会(以下简称 ASF)孵化器毕业一年啦! 北京时间 2021 年 4 月 9 日,ASF 官方宣布 Apache ...

  6. 【喜讯】新一代大数据任务调度 - Apache DolphinScheduler 社区荣获OSCHINA年度 “最佳技术团队”...

    新一代大数据任务调度 -  Apache DolphinScheduler 继 11 月 19 日由 InfoQ 举办.在 300+ 参评项目中脱颖而出获得 "2020 年度十大开源新锐项目 ...

  7. java的stream让我灵光一现

    说实话,我是一个到了退役也没有搞明白C++的istream和ostream的. 刚开始的时候我把<iostream>直接拆解成ios和tream 真,果粉暴露 退役之后划水,倒是从java ...

  8. java-servlet-EL表达式和java标签

    1      Servlet线程安全问题 1st.              为什么说servlet会有线程安全问题? 容器默认情况下,对于某个servlet,只会创建一个实例. 容器收到一个请求,就 ...

  9. Excel 运算符(三):文本连接符

    文本连接符&用来合并文本串.比如,连接"计算机"和"基础"两个文本串:"计算机基础"&"基础",最终结果 ...

  10. Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...