【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()方法 , 也有类似问题, 和上方问题一样的解决方案

相关推荐
feiduoge5 小时前
教程 44 - 相机系统
windows·游戏引擎·图形渲染
韩立学长6 小时前
【开题答辩实录分享】以《自助游网站的设计与实现》为例进行选题答辩实录分享
java·mysql·spring
ss2736 小时前
线程池:任务队列、工作线程与生命周期管理
java·后端
不像程序员的程序媛6 小时前
Spring的cacheEvict
java·后端·spring
SAP小崔说事儿6 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
凌云若寒6 小时前
半导体代加工企业标签模板痛点的全景式解决方案
java
松涛和鸣7 小时前
Linux Makefile : From Basic Syntax to Multi-File Project Compilation
linux·运维·服务器·前端·windows·哈希算法
shoubepatien7 小时前
JAVA -- 11
java·后端·intellij-idea
利剑 -~7 小时前
jdk源码解析
java·开发语言
Predestination王瀞潞7 小时前
JDK安装及环境变量配置
java·linux·开发语言