Java subList、toArray、asList 注意点
1. ArrayList的subList
结果不可以强转成ArrayList,否则抛出ClassCastException异常,原因是subList返回的是ArrayList的内部类SubList,并不是ArrayList,而是ArrayList的一个视图。举例
public class SublistTest {
public static void main(String[] args) {
ArrayList<Integer> myList = new ArrayList<Integer>();
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);
List<Integer> subList = myList.subList(1, 2);
System.out.println(myList);
System.out.println(subList);
}
}
输出
[1, 2, 3, 4]
[2]
对于subList的操作最终会反映在原列表中,如
public class SublistTest {
public static void main(String[] args) {
ArrayList<Integer> myList = new ArrayList<Integer>();
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);
List<Integer> subList = myList.subList(1, 2);
subList.add(5);
System.out.println(myList);
System.out.println(subList);
}
}
结果
[1, 2, 5, 3, 4]
[2, 5]
注意对原列表的修改,会导致子列表遍历、增加、删除都会产生ConcurrentModificationException异常,例
public class SublistTest {
public static void main(String[] args) {
ArrayList<Integer> myList = new ArrayList<Integer>();
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);
List<Integer> subList = myList.subList(1, 2);
myList.add(5);
System.out.println(myList);
System.out.println(subList);
}
}
结果
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1237)
at java.util.ArrayList$SubList.listIterator(ArrayList.java:1097)
at java.util.AbstractList.listIterator(AbstractList.java:299)
at java.util.ArrayList$SubList.iterator(ArrayList.java:1093)
at java.util.AbstractCollection.toString(AbstractCollection.java:454)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at SublistTest.main(SublistTest.java:16)
[1, 2, 3, 4, 5]
2. 集合转数组toArray
建议大小为list.size()。如果小于所需,toArray会重新分配内存空间,并返回数组地址:如果数组元素大于所需,多余的会置为null。举例
public class ToArrayTest {
public static void main(String[] args) {
List<Integer> myList = new ArrayList<Integer>();
myList.add(1);
myList.add(2);
myList.add(3);
Integer[] myArray = new Integer[myList.size()];
myList.toArray(myArray);
System.out.println(myList);
System.out.println(myArray.length);
}
}
结果
[1, 2, 3]
3
注:如果直接用无参数的list.toArray(),返回的是Object[]类,若强制转化成数组会出现ClassCastException异常
3. 使用asList把数组转化成集合
不要对得到的结果进行增、删操作,否则会抛出UnsupportedOperationException异常,例
public class AsListTest {
public static void main(String[] args) {
Integer[] myArray = new Integer[] {1, 2, 3};
List<Integer> myList = Arrays.asList(myArray);
myList.add(2);
// myList.remove(4);
}
}
结果
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at AsListTest.main(AsListTest.java:9)
原因:asList返回的是Arrays的内部类,并没有实现集合的修改方法,只是体现的适配器模式,只是转换接口,后台其实还是数组,这样对数据进行增删肯定是不行的。既然后台是数组,那么对元素的修改还是可以的,如
public class AsListTest {
public static void main(String[] args) {
Integer[] myArray = new Integer[] {1, 2, 3};
List<Integer> myList = Arrays.asList(myArray);
// myList.add(2);
// myList.remove(4);
myArray[1] = 5;
System.out.println(myArray[1]);
System.out.println(myList.get(1));
}
}
结果
5
5
Java subList、toArray、asList 注意点的更多相关文章
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- java.util.Arrays.asList 的小问题
JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util. ...
- subList和asList
subList subList返回仅仅只是一个视图.直接上源码 public List<E> subList(int fromIndex, int toIndex) { subListRa ...
- Java中toArray的用法探究(java数组与list转换)
转载原文地址: http://blog.csdn.net/guopengzhang/article/details/5497875 一. Incident import jav ...
- 由于java.util.Arrays.asList(...)导致的异常
前言: Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的 ...
- java subList方法小记
在java中,我们有时候需要对一个list进行拆分处理,这个时候就需要用到list的切割方法subList. 我们知道list里面的序号起始是从0开始的,所以一个含有23条数据的list,它的序号是从 ...
- Java之Arrays.asList陷阱
Java.Util.Arrays可以将数组转换为List,具体的定义如下: @SafeVarargs public static <T> List<T> asList(T... ...
- Java subList的使用
1. 在看<阿里巴巴java编程手册的时候>有如下强制约束 顺便学了一下subList. java.util.List中有一个subList方法,用来返回一个list的一部分的视图. Li ...
- 为什么 Java ArrayList.toArray(T[]) 方法的参数类型是 T 而不是 E ?
前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 <Effective Java>1 这本书再看看相关的章节.在 Item 24:E ...
随机推荐
- Max Sum—hdu1003(简单DP) 标签: dp 2016-05-05 20:51 92人阅读 评论(0)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 前端开发 - JavaScript 词法分析
JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 1.分析函数的参数 2.分析函数的变量声明 3.分析函数的函数声明表达式 具体步骤如下: 函数在运行的瞬间,生成 ...
- 关于CentOS下 yum包下载下的rpm包放置路径
在CentOS下用yum安装,回发现在/var/cache/yum/下的base.extrs和updates下的packages下都没有发现下载的RPM 原来在/etc/yum.conf下没有设置下载 ...
- Idea14 生成webservices
一直为idea生成soap协议的webservices而纠结,当初做axis2的时候,用的是eclipse,用它的插件来生成.这次做短信平台,决定要换一下,因为eclipse用axis2生成的接口,会 ...
- SQL SERVER 索引视图
创建: CREATE VIEW [dbo].[view_xxx] WITH SCHEMABINDING AS SELECT Table1.主键, Table1.外键 FROM Table1, Tabl ...
- WPF学习笔记(2):准确定位弹出窗
效果图:使弹出的列表框紧随在单元格的下边缘. 第一次,尝试在XAML中设置Popup的定位方式:Placement="Mouse".基本能够定位,但当在输入前移动鼠标,列表框就会随 ...
- “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Linux防火墙配置与管理(16)
防火墙指的是一个由软件和硬件设备组合而成.在内部网和外部网之间.专用网与公共网之间的边界上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intra ...
- ST表的原理及其实现
ST表类似树状数组,线段树这两种算法,是一种用于解决RMQ(Range Minimum/Maximum Query,即区间最值查询)问题的离线算法 与线段树相比,预处理复杂度同为O(nlogn),查询 ...
- 条件变量 sync.Cond
sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻 ...