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

相关推荐
ch.ju16 小时前
Java程序设计(第3版)第二章——函数的递归
java·开发语言
其实防守也摸鱼16 小时前
ctfshow--Crypto(crypto1-14)解题步骤
java·开发语言·网络·安全·密码学·ctf·ctfshow
Komore31516 小时前
java 泛型
java·开发语言·泛型
庞轩px16 小时前
第一篇:Redis数据结构底层——String、List、Hash、Set、ZSet各自用什么实现的?
数据结构·redis·list·set·hash·string·zset
数据法师16 小时前
Wise Force Deleter:专门解决Windows文件“无法删除”问题的免费工具
windows
古城小栈16 小时前
Rust 三方库 anyhow:极简错误处理实战指南
java·网络·rust
逻辑驱动的ken16 小时前
Java高频面试考点场景题26
java·开发语言·面试·职场和发展·求职招聘
星辰_mya17 小时前
领域驱动设计(DDD)“老中医”治理订单
java·后端·面试·架构