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. CSp2021/ NOIp2021 游记

    目录 Part 1. CSp2021 J S Part 2. NOIp2021 总结 Part 1. CSp2021 J 好水 挂飞 239pts,1= S 好毒瘤 rnm,写了个暴力就去搞 T2 \ ...

  2. YII的延迟加载

    类的映射表 use app\model\order \Yii::$classMap['app\models\Order'] = "D:\wamp\www\...\models\Order.p ...

  3. for(int i=0;i<1000;i++)与 for(int i=1;i<=1000;i++)。 if ( i%500){}//前者表示0-501一个循环,后者1-500一个循环

    `package com.Itbz; import java.sql.Connection; import java.sql.PreparedStatement; /** 向mysql数据库批量添加数 ...

  4. 论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement

    论文地址:单耳语音增强的时频注意 引用格式:Zhang Q, Song Q, Ni Z, et al. Time-Frequency Attention for Monaural Speech Enh ...

  5. 二位数组——扩展:冒泡排序、Arrays类

    1.冒泡排序 速记口诀(升序)   n个数字来排队:两两相比小靠前:外层循环n-1:内层循环n-i-1. 示例:定义一个数组,用冒泡排序将数组进行升序排序 关键代码: 输出结果: 2.Arrays 类 ...

  6. JavaScript 里三个点 ...,可不是省略号啊···

    摘要:Three dots ( - ) in JavaScript. 本文分享自华为云社区<JavaScript 里三个点 ... 的用法>,作者: Jerry Wang . Rest P ...

  7. 小技巧---eclipse 全选lib jar包

    按住shift键,点击第一个jar包,然后点击最后一个jar包,就全选了所有jar包,然后添加build path 添加到类路径

  8. CPU性能优化干货总结

    一.背景 部门成立专项组,对数智平台和站务系统做性能优化,其中目标之一为降低服务端硬件成本,即在32G内存.CPU银牌的配置下,能支撑1万+发客量.要达到此目标,需通过压力测试并配合监控系统,以QPS ...

  9. Android序列化的几种实现方式

    一.Serializable序列化 Serializable是java提供的一种序列化方式,其使用方式非常简单,只需要实现Serializable接口就可以实现序列化. public interfac ...

  10. Helm安装ingress-nginx-4.2.0

    Application version 1.3.0 Chart version 4.2.0 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...