基本类型数组转换列表陷阱(asList)

来源:互联网 发布:python 矩阵相乘 编辑:程序博客网 时间:2024/05/17 12:21

避开基本类型数组转换列表陷阱

示例:

public class test {   public static void main(String[] args) {    int[] data={1,2,3,4,5};    List<int[]> asList = Arrays.asList(data);  System.out.println(asList);  System.out.println("int数组在集合中的类型:"+asList.get(0).getClass());  System.out.println(data.equals(asList.get(0)));   }}

结果:
[[I@15db9742]
int数组在集合中的类型:class [I
true
从结果看出int数组被直接作为一个元素存储在了集合中,那怎样才能正确存储呢?
只需要做一下简单的修改就好了

public class test {   public static void main(String[] args) {    Integer[] data={1,2,3,4,5};    List<int[]> asList = Arrays.asList(data);  System.out.println(asList);  System.out.println("int数组在集合中的类型:"+asList.get(0).getClass());  System.out.println(data.equals(asList.get(0)));   }}

仔细的同学会发现只是把int[]改变成了Integer[]结果就发生了很大的变化,这就是基本类型与包装类型的却别啦.大家以后再转化的时候一定要注意哦

注意AsList方法产生的List对象不可更改

代码:

public class test {    public static void main(String[] args) {         //五天工作日         Week[] workDays={Week.Mon,Week.Tue,Week.Wed,Week.Thu,Week.Fri};         //转换列表         List<Week> list=Arrays.asList(workDays);         //增加周六也为工作日         list.add(Week.Sat);    }}

结果
Exception in thread “main” java.lang.UnsupportedOperationException
为什么会报异常呢?
发掘asList方法源码:

public static <T> List<T> asList(T... a){ return new ArrayList<T>(a);}

是直接new ArrayList对象啊,怎么会没有add方法呢?哈哈,看看上面导入的包吧.你会发现他用的Arrays工具类中的一个内之类,并不是我们意识中的java.util.ArrayList 中的,内置类的构造如下:

private static class ArrayList<E> extends AbstractList<E>inpltments RandomAccess,java.io.Serizable{ //存储列表元素的数组 private final E[] a; //唯一的构造函数 Arraylist(E[] array){  if(array==null) throw new NullPointException();  a=array; } /*其他省略*/}

这里的ArrayList是一个静态私有内部类,只有Arrays呢狗访问,他并没有提供add方法
有人会觉得他的弗雷AbstractList提供了(不见棺材不掉泪)来看源码吧:

public boolean add(E e){  throw new UnsupportedOperatiobnException();}

父类确实提供了,但是并没有具体实现,在这个ArrayList静态内部类中他仅仅实现了5个方法:
size:元素数量.
toArray:转化为数组,实现数组的浅拷贝
get:获得指定元素
set:重置某一元素
contains:是否包含某元素
对于我们经常使用的List.add和List.remove()方法都没有实现,也就是说asList返回的是一个长度不可变的列表

原创粉丝点击