java 中将数组转换成list的方法
目录:
1.将数组转成list的一般方法
2.一般方法的弊端
3.正确的解决方法
4.代码实现
—————————————————————————
1.将数组转为list的一般方法
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = Arrays.asList(myArray);
//上面两个语句等价于下面一条语句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");
JDK中源码对于该方法的说明:
/**
*返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
*/
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
2.一般方法的弊端
《阿里巴巴Java 开发手册》对其的描述:
Arrays.asList()将数组转换为集合后,底层其实还是数组,《阿里巴巴Java 开发手册》对于这个方法有如下描述:
当使用集合的修改方法:add(),remove(),clear()方法时会抛出异常:
List myList = Arrays.asList(1, 2, 3);
myList.add(4);//运行时报错:UnsupportedOperationException
myList.remove(1);//运行时报错:UnsupportedOperationException
myList.clear();//运行时报错:UnsupportedOperationException
System.out.println(myList.getClass());//class java.util.Arrays$ArrayList
当我们看一下java.util.AbstractList的remove()方法,这样我们就明白为啥会抛出UnsupportedOperationException。
public E remove(int index) {
throw new UnsupportedOperationException();
}
3.正确的解决方式
1)可以使用ArrayList类的构造方法将Arrays.asList(“a”, “b”, “c”)对象当做参数传进构造方法中。
2)可以使用JDK1.8中的stream方式实现
4.代码实现
List<Integer> myList = Arrays.asList(1,2,3);
//直接调用抛出java.lang.UnsupportedOperationException
myList.add(4);
System.out.println(myList);//抛出异常
//方法(1)
List addList = new ArrayList(myList);
addList.add(4);
System.out.println(addList);//[1, 2, 3, 4]
//方法(2)
List<Integer> ss = myList.stream().collect(Collectors.toList());
ss.add(4);
System.out.println(ss);//[1, 2, 3, 4]