先来看下asList方法的源代码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
发现他返回的是ArrayList类的对象,但要注意,Arrays.asList()方法返回的是Arrays的内部类ArrayList的对象,而不是java.util.ArrayList类的对象。
Arrays的内部类ArrayList和java.util.ArrayList都继承了AbstractList的remove、add等方法,AbstractList中的这些方法都抛出了UnsupportedOperationException异常。但java.util.ArrayList重写了这些方法所以不会抛出异常,而Arrays的内部类ArrayList并没有重写这些方法,所以我们在调用Arrays.asList()方法产生的List集合的add、remove方法时就会报UnsupportedOperationException异常。
Scanner scanner = new Scanner(System.in);
String nextString = scanner.next();
List list = Arrays.asList(nextString.split(","));
list.add("a"); // 报错
list.remove(3); // 报错
解决方法:
不直接接收List集合,而是将Arrays.asList返回的内部类对象用java.util.ArrayList的构造方法初始化。
Scanner scanner = new Scanner(System.in);
String nextString = scanner.next();
List<String> list = new ArrayList<>(Arrays.asList(nextString.split(",")));
list.add("a");
list.remove(3);