ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Arrays.asList()你真的知道怎么用吗?

2022-09-06 00:04:32  阅读:163  来源: 互联网

标签:arr Arrays List list int 数组 真的 asList


发现问题

前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题

// 注意这是一个Integer对象的数组哦
Integer[] arr = new Integer[]{9999,88,77};
List<Integer> list = Arrays.asList(arr);
// 执行以下操作,有问题么?
list.add(1);
list.remove(0);

好的,如果你觉得没错,和我刚开始的想法一致。在我没有认真学习这个asList方法时,天真的以为没有问题,顾名思义啊,就是把数组转换成List呗。

// 恭喜,喜提报错,如果是这样测试该找你麻烦了,/(ㄒoㄒ)/~~ 
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at TestForAsList.main(TestForAsList.java:13)

废话不多说,我们直接进源码里面看看。

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);  // 看起来没有任何异常,emm。然而呢,这个ArrayList并不是Java.util包下的ArrayList,而是一个在Arrays下实现的内部类。
}

image

我们发现这个静态内部类里面并没有实现List的add和remove方法。那么子类将延用父类AbstractList的方法实现,这个继承应没有什么问题。

// 我们进入这个父类的实现,发现了报错的根源。。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    
	public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }


    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
}

总结:

究其原因,就是这个asList方法返回的是一个内部类,只实现了一些遍历以及更新的方法。下次使用它的时候需要注意一下。

扩展知识点

数组值的变化

然后我就发现了这个很有意思的点,就是这个Arrays包下的ArrayList用的是构造器传进来的数组,并不像我们原来认为的ArrayList的那样会拷贝数组然后创建一个新的数组。

这意味着我们在对这个List进行set的改动时,我们同时会更改原数组的值

public static void main(String[] args) {
        Integer[] arr = new Integer[]{9999,88,77};
        List<Integer> list = Arrays.asList(arr);
        
        list.set(1,0);
        System.out.println(list.get(1));  // 输出0
        System.out.println(arr[1]);  // 同样也输出了0
}

int[]数组

我们都知道int是基本数据类型,如果我们向asList()方法里面传入一个int[]数组会发生什么呢?

我们知道泛型的话需要的是对象类型,基础数据类型是不能作为泛型的。

// 此时int[]会作为一个对象类型,然后转换为list。此时长度为1,且可以正常的取出来作为list元素
public static void main(String[] args) {
        int[] arr = new int[]{9999,88,77};
        List<int[]> list = Arrays.asList(arr);
        System.out.println(list.size());
        System.out.println(list.get(0)[0]);
        System.out.println(list.get(0)[1]);
        System.out.println(list.get(0)[2]);
}

好了,asList()方法就学废了。一天学废一个小知识/dog

标签:arr,Arrays,List,list,int,数组,真的,asList
来源: https://www.cnblogs.com/duizhangz/p/16660118.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有