Arrays.asList(@NotNull T... a) 用法总结
1、Arrays.asList()方法简介
- Arrays.asList主要用来将泛型可变长参数转换为List。
- T… a是泛型可变长参数,可以简单理解为是数组。 一个方法只能有一个可变长参数,并且这个可变长参数必须是该方法的最后一个参数。
2、Arrays.asList()源码
/**
* Returns a fixed-size list backed by the specified array. (Changes to
* the returned list "write through" to the array.) This method acts
* as bridge between array-based and collection-based APIs, in
* combination with {@link Collection#toArray}. The returned list is
* serializable and implements {@link RandomAccess}.
*
* <p>This method also provides a convenient way to create a fixed-size
* list initialized to contain several elements:
* <pre>
* List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
* </pre>
*
* @param <T> the class of the objects in the array
* @param a the array by which the list will be backed
* @return a list view of the specified array
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
注意,上面源码中,new ArrayList<>(a); 并非是new 的java.util包下的ArrayList,而是new的Arrays中的内部类,如下:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
......
}
3、Arrays.asList几种场景及易出现问题
3.1、Arrays.asList(String[]) 字符串数组转List
public static void main(String[] args) {
List<String> list = Arrays.asList("jack", "bob", "alice", "mark");
System.out.println(JSON.toJSONString(list));
// 结果返回:["jack","bob","alice","mark"]
}
3.2、Arrays.asList(int[]) int数组转List
public static void main(String[] args) {
int[] intarr = {1, 3, 4, 5, 6};
List intList = Arrays.asList(intarr);
System.out.println(JSON.toJSONString(intList));
}
// 返回结果:[[1,3,4,5,6]]
// 注意:这里有个问题点需要注意,看下面:
-
仅从结果打印上看,很多粗心的人回认为int数组和String数组转List都可以正确打印,并且数值也都按照int数组和String数组中的值打印出来了,但需要注意的是,打印的JSON串是有区别的:
["jack","bob","alice","mark"] // 这是String数组打印值 [[1,3,4,5,6]] // 这是int数组打印值
-
从上面打印的结果值可以看出,int数组外层是多了一个中括号的; 这种情况是因为转换的入参是泛型T… a,而泛型不能是基本数据类型,但为什么我们这里传的int数组没报错,也可以打印出来呢?因为Arrays.asList方法将入参的int数组当做是一个整体,该整体作为泛型传入参数,所以打印结果值的外面是多一层中括号的。 为方便理解,可以将int size = intList.size();打印,其结果是1,而不是5。
3.3、Arrays.asList(Person[]) Person对象数组转List
public static void main(String[] args) {
List<Person> peopleList = Arrays.asList(new Person(22, "张三"), new Person(33, "李四"), new Person(44, "王五"));
System.out.println(JSON.toJSONString(peopleList));
// 打印结果为:[{"age":22,"name":"张三"},{"age":33,"name":"李四"},{"age":44,"name":"王五"}]
}
- 可以看到代码中,直接传的是Person对象。若有一种场景,我需要在List中再添加上“赵六的信息”,这时我如果使用peopleList.add(new Person(55, “赵六”));就会报错。 是因为Arrays.asList得到的List是一个长度不可变的list,若想改为长度,可以使用:
List<Person> peopleList = Arrays.asList(new Person(22, "张三"), new Person(33, "李四"), new Person(44, "王五"));
System.out.println(JSON.toJSONString(peopleList));
// 将Arrays.asList生产的List转换成可变长的List
ArrayList<Person> peoples = new ArrayList<>(peopleList);
peoples.add(new Person(55, "赵六"));
- 报错信息:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)