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&lt;String&gt; 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小野猪

若恰好解决你的问题,望打赏哦。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值