虽然数组和集合的转换我们开发中常用,但是下面我说明的这几点很多人平时都没有注意。
数组转集合
在数组转集合过程中,要特别注意是否使用了视图方式直接反悔了数组中数据。
以Arrays.asList()为例,它把数组转为集合后,不能使用集合相关方法,主要是add/remove/clear这几个修改集合长度的方法,否则会报UnsupportedOperationException异常。
public static void main(String[] args){
String[] arr = new String[];
arr[0]="one";
arr[1]="two";
arr[2]="three";
List<String> list = Arrays.toList(arr);
list.set(0,"oneList");
system.out.println(arr[0]); //输出oneList
//一下三个方法均会抛出异常
list.add("four");
list.remove();
list.clear();
}
原因是Arrays.asList()用的是适配器模式,后台数据仍是原来的数组,所以修改集合值的时候,原有数组也会改变。asList()方法返回的是Arrays的内部类,这个内部类并未实现修改集合个数的方法。
Arrays.asList()源码如下
public static<T> List<T> asList<T...a>{
return new ArrayList<>(a);
}
一定要注意这个内部类的ArrayList并不是集合类中的那个ArrayList.具体的大家可以去看源码。
集合转数组
一定不要用list.toArray()无参方法接受结果。
Object[] arr = list.toArray();//原因是无参会使得泛型丢失,后续会有类型转化异常的问题
要用下面带参的,并且数组长度n一定要和list.size()一样,否则,不管是多了还是少了,都会影响执行效率。
T[] arr = new T[n];
T[] arrT = list.toArray(arr);