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 注意点的更多相关文章

  1. 【转】java.util.Arrays.asList 的用法

    DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...

  2. java.util.Arrays.asList 的小问题

    JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util. ...

  3. subList和asList

    subList subList返回仅仅只是一个视图.直接上源码 public List<E> subList(int fromIndex, int toIndex) { subListRa ...

  4. Java中toArray的用法探究(java数组与list转换)

    转载原文地址: http://blog.csdn.net/guopengzhang/article/details/5497875 一.             Incident import jav ...

  5. 由于java.util.Arrays.asList(...)导致的异常

    前言: Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的 ...

  6. java subList方法小记

    在java中,我们有时候需要对一个list进行拆分处理,这个时候就需要用到list的切割方法subList. 我们知道list里面的序号起始是从0开始的,所以一个含有23条数据的list,它的序号是从 ...

  7. Java之Arrays.asList陷阱

    Java.Util.Arrays可以将数组转换为List,具体的定义如下: @SafeVarargs public static <T> List<T> asList(T... ...

  8. Java subList的使用

    1. 在看<阿里巴巴java编程手册的时候>有如下强制约束 顺便学了一下subList. java.util.List中有一个subList方法,用来返回一个list的一部分的视图. Li ...

  9. 为什么 Java ArrayList.toArray(T[]) 方法的参数类型是 T 而不是 E ?

    前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 <Effective Java>1 这本书再看看相关的章节.在 Item 24:E ...

随机推荐

  1. 1.虚拟机中安装ubuntu

    1.VMware安装很简单,全部默认安装即可. 2.安装完VMware之后,打开VMware,点击创建虚拟机 典型安装易出问题,所以这里选择自定义安装 安装过程选项配置如下 处理器数,核数,内存都可以 ...

  2. ClientDataSet 心得

    1.   与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.很多数据库应用程序都用了BDE,BDE往往给发布带来很大的不便 ...

  3. VisualSVN 破解方法

    第一步,首先准备反汇编工具 ildasm.exe,找到VisualSVN的安装路径,一般先备份,在备份里面操作. 第二步,转储 , 得到同名的il文件:VisualSVN.Core.L.il,用记事本 ...

  4. ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库

    使用NPOI导入Excel 首先在MVC项目中导入NPOI 查询NPOI安装,排序依据,选择:最高下载量,选择第一个. 在控制器中创建ExcelController 在Index视图中写入代码: @u ...

  5. How do I convert an IIR filter into a FIR filter in digital signal processing?

    Maybe you were asking if there is some kind of design tool allowing to convert an IIR filter into an ...

  6. 【计算机网络】 网络体系结构分类: 客户机/服务器体系和P2P

    网络体系结构的分类 现代网络应用程序有两种主流的体系结构: 客户机/服务器体系结构和P2P体系结构(peer to peer “对等”)   一 . 客户机/服务器体系结构     客户机/服务器体系 ...

  7. 配置kali linux

    在7月底的时候,安全加介绍Fireeye出品的 免费恶意软件分析工具FlareVM,还可进行逆向工程和渗透测试 .今天是看到绿盟科技的一篇介绍Kali Linux配置的文章,这个工具也进入了 渗透测试 ...

  8. [学习笔记]树套树 线段树套Splay

    今天调了一个早上哈哈哈,不过因为\(Splay\),常数比较大 洛谷的评测记录: \(Code\ Below:\) #include <bits/stdc++.h> #define ll ...

  9. Sublime Text3 实现在浏览器中以HTML格式预览md文件

    1.首先找到Package Control 打开Sublime Text3,找到菜单栏:Preferences → Package Control,没有找到Package Control,那么点击Pa ...

  10. Eclipse的使用与Oblect类的常用方法_DAY11

    一.Java开发工具的使用 A:notepad windows自带的记事本. B:高级记事本 Editplus Notepad++ UE sublime2 C:集成开发工具(IDE) 开发和运行. E ...