Java——踩坑Arrays.asList()

  1. 坑1:不能直接使用 Arrsys.asList() 来转换基本类型数据
java 复制代码
public static void test1(){
        // 1、不能直接使用asList来转换基本类型数组
        int[] arr = {1, 2, 3};
        List list = Arrays.asList(arr);
        System.out.printf("list:%s size:%s class:%s", list, list.size(), list.get(0).getClass());
    }

输出结果:

java 复制代码
list:[[I@27f8302d] size:1 class:class [I

原因:

查看源码可以看到,接收入参为泛型,而基本类型并没有集成Object

java 复制代码
@SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

解决方法:

进行装箱或者直接使用包装类型

java 复制代码
public static void test1(){
        // 1、不能直接使用asList来转换基本类型数组
        Integer[] arr = {1, 2, 3};
        List list = Arrays.asList(arr);
        System.out.printf("list:%s size:%s class:%s", list, list.size(), list.get(0).getClass());
    }
java 复制代码
list:[1, 2, 3] size:3 class:class java.lang.Integer
  1. 坑2:Arrays.asList() 返回到List不支持增删操作
java 复制代码
public static void test2(){
        String[] arr = {"1", "2", "3"};
        List list = Arrays.asList(arr);
        try {
            list.add("4");
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.printf("arr:%s, list:%s", Arrays.toString(arr), list);
    }

输出结果:

报了不支持的操作异常

java 复制代码
java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.ooamo.test.AsListTest.test2(AsListTest.java:25)
	at com.ooamo.test.AsListTest.main(AsListTest.java:11)
arr:[1, 2, 3], list:[1, 2, 3]

原因:

查看源码可以看到,asList返回到ArrayList是一个内部类,继承了AbstractList,再查看源码,并没有是哪set,add,remove方法

解决方法:

asList之后new一个List给他

java 复制代码
public static void test2(){
        String[] arr = {"1", "2", "3"};
        List list = new ArrayList(Arrays.asList(arr));
        try {
            list.add("4");
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.printf("arr:%s, list:%s", Arrays.toString(arr), list);
    }
  1. 坑3:对原数组的修改会影响 Arrays.asList() 返回的那个List
java 复制代码
public static void test3(){
        String[] arr = {"1", "2", "3"};
        List list = Arrays.asList(arr);
        arr[0] = "0";
        System.out.printf("arr:%s, list:%s", Arrays.toString(arr), list);
    }

输出结果:

java 复制代码
arr:[0, 2, 3], list:[0, 2, 3]

原因:

两者为同个引用

解决方法:

new一个新的List

java 复制代码
public static void test3(){
        String[] arr = {"1", "2", "3"};
        List list = new ArrayList(Arrays.asList(arr));
        arr[0] = "0";
        System.out.printf("arr:%s, list:%s", Arrays.toString(arr), list);
    }
java 复制代码
arr:[0, 2, 3], list:[1, 2, 3]
相关推荐
Mr.Jessy44 分钟前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
云栖梦泽3 小时前
鸿蒙应用签名与上架全流程:从开发完成到用户手中
开发语言·鸿蒙系统
爱上妖精的尾巴3 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
Goldn.4 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐5 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
小鸡吃米…5 小时前
Python 列表
开发语言·python
m0_740043735 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖5 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
kaikaile19955 小时前
基于C#实现一维码和二维码打印程序
开发语言·c#
我不是程序猿儿5 小时前
【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
开发语言·c#