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]
相关推荐
都叫我大帅哥8 分钟前
谁说数据库不能“直播”?用Debezium玩转实时数据流!
java
写bug写bug14 分钟前
彻底搞懂Spring Boot的系统监控机制
java·后端·spring
啃火龙果的兔子26 分钟前
Form.Item中判断其他Form.Item的值
开发语言·前端·javascript
学习编程的gas36 分钟前
C++多态:理解面向对象的“一个接口,多种实现”
开发语言·c++
D_alyoo40 分钟前
02 流程流转
java
EndingCoder1 小时前
Next.js 中间件:自定义请求处理
开发语言·前端·javascript·react.js·中间件·全栈·next.js
FirstFrost --sy1 小时前
C++ stack and queue
开发语言·c++·queue·stack·priority_queue
墨城之左1 小时前
低版本 IntelliJ IDEA 使用高版本 JDK 语言特性的问题
java·开发语言·intellij-idea·jdk21
帧栈1 小时前
开发避坑指南(23):Tomcat高版本URL特殊字符限制问题解决方案(RFC 7230 RFC 3986)
java·tomcat