Java数组和List转换中的误区

虽然数组和集合的转换我们开发中常用,但是下面我说明的这几点很多人平时都没有注意。

数组转集合

在数组转集合过程中,要特别注意是否使用了视图方式直接反悔了数组中数据。
以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);

你可能感兴趣的:(java,SE)