【Java】List一部分常见问题

List一部分常见问题

基本数据类型与asList();

java 复制代码
		//int数组
		int[] str = {1, 2, 3};
        //转换成List
        List list =Arrays.asList(str);

        { // 输出
            //遍历数组和list
            for (int i = 0; i < str.length; i++) {
                System.out.print(str[i] + "   ");
            }
            
            System.out.println();
            
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i) + "   ");
            }
            
            System.out.println();
        }

结果 :

在使用 Arrays.asList(); 方法,将数组转换为List时 , 会将 int[] 视为一个对象

而不是将数组中的每个元素作为单独的对象 添加到 List 中。因此,list 实际上只包含一个元素,即 int[] 数组本身

而解决方式也很简单, 改为封装类就OK了

java 复制代码
		//int数组
		Integer[] str = {1, 2, 3};
        //转换成List
        List list =Arrays.asList(str);

        { // 输出
            //遍历数组和list
            for (int i = 0; i < str.length; i++) {
                System.out.print(str[i] + "   ");
            }
            
            System.out.println();
            
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i) + "   ");
            }
            
            System.out.println();
        }

结果:

转换后无法新增和删除

java 复制代码
		//int数组
		Integer[] str = {1, 2, 3};
        //转换成List
        List list =Arrays.asList(str);

        { // 输出
            //遍历数组和list
            for (int i = 0; i < str.length; i++) {
                System.out.print(str[i] + "   ");
            }
            
            System.out.println();
            
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i) + "   ");
            }
            
            System.out.println();
            list.remove(1);
        	//list.add(1);
        }

可以看到, 转换后进行增改会报错, 那这又是为什么?

我们直接进入源代码中查看

发现返回的是一个new ArrayList

我们看ArrayList中, 并没有增加和删除方法, 那这两个方法又为什么可以使用?

可以看见,ArrayList继承了AbstractList , 进入内部, 可以找到add和remove源码

直接返回错误 , 现在就解释的通了 , 而解决方法也很简单, 和下方这个问题一样 , 仅需添加 new ArrayList();就可以解决

转换后的值相同问题

java 复制代码
		//int数组
		Integer[] str = {1, 2, 3};
        //转换成List
        List list =Arrays.asList(str);

        { // 输出
            //遍历数组和list
            for (int i = 0; i < str.length; i++) {
                System.out.print(str[i] + "   ");
            }
            
            System.out.println();
            
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i) + "   ");
            }
           
        }
        
        System.out.println("\n----------------------------");
        
        //修改数据 ---------------------修改数据后------------------
        list.set(0, 10000);
        //str[0] = 10000;
        
	{
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]+"   ");
        }
        System.out.println();
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+"   ");
        }
	}

结果:

可以看到, 无论是修改两者的哪一个数值, 另外一个的数据也会被影响, 这是为什么呢?
Arrays.asList(str): , 返回一个固定大小的 List,其底层是 str 数组 , list接收后也依然是原数组

解决方法也很简单
创建一个新的 ArrayList,将 Arrays.asList(str) 中的所有元素复制到这个新的 ArrayList 中。

新的 ArrayList 是一个独立的对象,与原始数组 str 无关。

因此,修改 list 中的元素不会影响 str 中的元素。

java 复制代码
		//int数组
		Integer[] str = {1, 2, 3};
        //转换成List --------------------仅添加 new ArrayList();--------------------
        List list =new ArrayList(Arrays.asList(str));

        { // 输出
            //遍历数组和list
            for (int i = 0; i < str.length; i++) {
                System.out.print(str[i] + "   ");
            }
            
            System.out.println();
            
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i) + "   ");
            }
           
        }
        
        System.out.println("\n----------------------------");
        
        //修改数据 ---------------------修改数据后------------------
        list.set(0, 10000);
        //str[0] = 10000;
        
	{
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]+"   ");
        }
        System.out.println();
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+"   ");
        }
	}

可以看见, 问题解决了, 两者数据不再相互影响;

PS : subList()方法 , 也有类似问题, 和上方问题一样的解决方案

相关推荐
llwszx3 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
芳草萋萋鹦鹉洲哦3 小时前
【vue3+tauri+rust】如何实现下载文件mac+windows
windows·macos·rust
李洋-蛟龙腾飞公司3 小时前
HarmonyOS NEXT应用元服务常见列表操作多类型列表项场景
windows
云泽野3 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person4 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜5 小时前
java异常学习
java
FrankYoou6 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*6 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了6 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来7 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea