避开基本类型数组转换列表陷阱
示例:
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返回的是一个长度不可变的列表