数组转List:
通过遍历赋值就不说了
1、 通过Arrays.asList()方法
public static void main(String[] args) throws Exception {
Integer[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
System.out.println("通过Arrays.asList()方法:" + list);
List<Integer> list2 = new ArrayList<>();
Collections.addAll(list2,arr);
System.out.println("通过Collections.addAll()方法:" + list2);
}
通过Arrays.asList()方法:[1, 2, 3, 4, 5]
通过Collections.addAll()方法:[1, 2, 3, 4, 5]
Process finished with exit code 0
需要注意的是:
- 我们这里用的数组类型是Integer而不是int,用int直接出错,也就是说只能用基本数据类型的包装类型,才能直接转为List
这是为嘛呢?看Arrays.asList的源码,
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
其中<T> List<T> asList(T... a)
这是泛型的固定语法,第一个<T>
是申明T为泛型,如果没有这一项,编译器无法解释后面的两个T是什么,因为Java中不存在T类型。T… a表明支持多参列表,比如
int[] arr = {1, 2, 3, 4, 5};
List<int[]> list = Arrays.asList(arr,arr);
继续上一个疑惑,原因是Arrays.asList()
需要传入的参数类型是泛型中的通配类型 ,返回值类型List也需要与之匹配,并且所有的泛型必须是引用类型。因此传入int[ ]类型的数组,由于int[ ] 整体可以看作一个引用类型,所以asList就把整个数组作为一个元素来存放到List中去,然而List中只能保存Integer类型的元素,所以报错。(这样说应该好理解一点吧,我开始还在疑惑为什么Integer[ ] 数组就可以,后来想的就是传入的是数组,要返回的List也是数组形式,二者同级,存放的都是Integer元素这样很匹配,,,而传入int[ ]时数组是一个引用类型,传入asList没问题,但是这时只能看作整体来处理了,左边Integer右边int[ ]显然不合理)
然而这样却是对的
- 另外用Arrays.asList()方法转换后的List并不是原汁原味的java.util.ArrayList类型,不能对转换后的List增删,只能查改。这是因为Arrays.asList()返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()、remove()方法会报错。
可以通过这种方法来解决这种问题
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
2、通过 Collections.addAll()方法
上边已经写了Collections.addAll()方法如何使用,并且通过这种方式转换后的List可以进行增删,由于定义的就是原汁原味的List,只是利用Collections.addAll()方法将数组中元素添加进来,跟Arrays.asList()方法一样需要保证数据类型统一。
List转数组:
1、list.toArray()方法
public static void main(String[] args) throws Exception {
Integer[] arr = {1, 2, 3, 4, 5};
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
Object[] b = list.toArray();
System.out.println("通过toArray()方法将List转为Object类型数组:"+Arrays.toString(b));
Integer[] a = (Integer[]) list.toArray(new Integer[]{});
System.out.println("通过toArray()方法将List转为Integer类型数组:"+Arrays.toString(a));
}
list.toArray()方法直接返回的是Object[ ]类型,如果需要前后转换类型一样,则需要通过Integer[] a = (Integer[]) list.toArray(new Integer[]{});
有点复杂,谁让它就这样定义的呢
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}