public static void main(String[] args) { String[] strArray = new String[2]; List<String> list = Arrays.asList(strArray); list.add("AA"); System.out.println(list); }
Exception in thread "main" java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) at com.yefengyu.learn.Array2List.main(Array2List.java:11)
通过 Arrays.asList(T... a)
方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。
public static void main(String[] args) { String[] strArray = new String[]{"1", "2"}; List<String> list = Arrays.asList(strArray); list.set(0, "10"); System.out.println(list); }
[10, 2] Process finished with exit code 0
通过ArrayList的构造器,将 Arrays.asList(T... a)
的返回值由 java.util.Arrays.ArrayList
转为 java.util.ArrayList
public static void main(String[] args) { String[] strArray = new String[]{"1", "2"}; List<String> list = new ArrayList<>(Arrays.asList(strArray)); list.add("AA"); list.remove(0); System.out.println(list); }
[2, AA] Process finished with exit code 0
通过 boolean addAll(Collection<? super T> c, T... elements)
方式转换,根据数组的长度创建一个长度相同的List,然后通过 Collections.addAll(Collection<? super T> c, T... elements)
方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。
public static void main(String[] args) { String[] strArray = new String[]{"1", "2"}; ArrayList< String> list = new ArrayList<>(strArray.length); Collections.addAll(list, strArray); list.add("AA"); list.remove(0); System.out.println(list); }
[2, AA] Process finished with exit code 0
需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。
Collections.addAll源码如下:
public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element); return result; }
int[] strArray = new int[]{1, 2}; List<Integer> list = Arrays.asList(strArray);
上面代码编译会报错!而下面的不会。
Integer[] strArray = new Integer[]{1, 2}; List<Integer> list = Arrays.asList(strArray);
int[]不能直接转换为List<Integer>,而Integer[]就可以转换为List<Integer>。因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integer是class类型,属于引用类型,所以Integer可以作为List形参,List<Integer>在java中是可以存在的,但不存在List<int>类型。