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. 绝对路径和相对路径和File类的构造方法

    路径: 绝对路径:是一个完整的路径 以盼复(C:,D:)开始的路径 c:\a.txt C:\User\itcast\IdeaProjects\shungyuan\123.txt D:\demo\b.t ...

  2. 如何记录分析你的炼丹流程—可视化神器Wandb使用笔记【1】

    本节主要记录使用wandb记录训练曲线以及上传一些格式的数据将其展示在wandb中以便分析的方法,略过注册安装部分(可使用pip intall wandb安装,注册相关issue可上网搜索),文章着重 ...

  3. C# 发送Http请求,传文件和其他参数

    /// <summary> /// httpWebRequest post by dic /// </summary> /// <param name="url ...

  4. 协程 && 异步例子

    # 异步redis # 在使用python代码操作redis的时候,连接.操作.断开都是网络IO. # 安装aioredis模块: pip install aioredis==1.3.1 # 例: 该 ...

  5. git diff与linux diff的输出格式之unified format

    前言 前面有一篇文章<一个有些意思的项目--文件夹对比工具(一)>,里面简单讲了下diff算法之--Myers算法. 既然是算法,就会有实现,比如git diff中有Myers的实现,gi ...

  6. 发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows

    发布用于Windows的 .NET MAUI 应用 打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例, cd BlazorMaui BlazorMaui 替换为你自己工程名 ...

  7. 羽夏看Linux内核——引导启动(下)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  8. 我写的蓝宝石留言本php版 v4.5

    蓝宝石留言本php版v4.5采用原生php编写,在php5.6~php7.x下调试通过.本留言本使用了utf-8编码. include/config1.php是数据库连接参数的配置文件, includ ...

  9. Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 下图是一个产品开发中非常常见的大屏展示界面 ...

  10. TypeScript 项目报错 Unknown file extension ".ts"

    下图是该问题的详细报错截图,经过多次捣鼓,初步猜测是模块有问题,要用 ES Module 还真是曲折,最不容易出错的就是 CommonJS 模块: 在百度.Bing 上搜索了好久的帖子也都没有相关的解 ...