避开Arrays.asList使用的坑

坑1:不能对Arrays.asList返回的list进行增删操作

java 复制代码
    /**
     * 坑1:不能对Arrays.asList返回的list进行增删操作
     * @param args
     */
    public static void main1(String[] args) {
        String[] arr = new String[]{"a", "b", "c"};
        List<String> list = Arrays.asList(arr);
        // 集合元素不能新增
        try {
            list.add("s");
        } catch (Exception e) {
            System.out.println("不能新增, class: " + e.getClass() + " errorMssg: " + e.getMessage());
        }

        try {
            // 集合元素不能删除
            list.remove("a");
        } catch (Exception e) {
            System.out.println("不能删除, case: " + e.getClass() + " errorMssg:" + e.getMessage());
        }
        
        // 可以修改集合元素
        list.set(0, "s");
        System.out.println("修改成功!");
    }

测试

坑2:会把集合整个作为对象存储

java 复制代码
    /**
     * 坑2:会把集合整个作为对象存储
     * @param args
     */
    public static List main2(String[] args) {
        int[] arr = new int[]{1, 2, 3};
        List list = Arrays.asList(arr);
        return list;
    }

测试

输出数组对象

针对这一现象,只需要将int转为封装类型即可

java 复制代码
    /**
     * 坑2之填坑法
     */
    public static List main2_1(String[] args) {
        Integer[] arr = new Integer[]{1, 2, 3};
        List list = Arrays.asList(arr);
        return list;
    }

坑3:修改元素,会同时修改原集合的元素

java 复制代码
    /**
     * 坑3:修改元素,会同时修改原集合的元素
     * @param args
     */
    public static void main3(String[] args) {
        String[] arr = new String[]{"a", "b", "c"};
        List<String> list = Arrays.asList(arr);
        list.set(0, "s");
        for (String s : arr) {
            System.out.println(s);
        }
    }

测试

改变原数组对象

正确写法

java 复制代码
    /**
     * 对坑3的填坑法
     */
    public static void main3_1(String[] args) {
        String[] arr = new String[]{"a", "b", "c"};
        List<String> list = new ArrayList<>(Arrays.asList(arr));
        list.set(0, "s");
        for (String s : arr) {
            System.out.println(s);
        }
    }

测试

注:测试Arrays.asList的坑。学习内容来自图灵--徐庶

相关推荐
Boilermaker19926 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维7 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_997 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子7 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34167 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体18 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18098 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
wszy18098 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假9 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔9 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin