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

相关推荐
生如夏花℡14 分钟前
JAVA学习记录3
java·学习·idea
{⌐■_■}20 分钟前
【gRPC】对称与非对称加解密和单向TLS与双向TLS讲解与go案例
java·servlet·golang
敲代码养活全家38 分钟前
ElasticsearchJavaClient工具类分析
java·elasticsearch·搜索引擎
蟹黄堡在逃员工43 分钟前
消息队列MQ(一)
java·后端
nSponge1 小时前
【Duilib】 List控件支持多选和获取选择的多条数据
c++·windows·工具
栗豆包1 小时前
w148基于spring boot的文档管理系统的设计与实现
java·spring boot·后端·spring·tornado
一直学习永不止步1 小时前
LeetCode题练习与总结:随机翻转矩阵--519
java·数学·算法·leetcode·哈希表·水塘抽样·随机化
Y Shy1 小时前
Windows C++开发环境:VSCode + cmake + ninja + msvc (cl.exe) + msys2/bash shell
c++·windows·vscode·msvc·cmake·msys2·ninja
伤魂孤傲1 小时前
强制关闭Redis快照导致不能持久化
java·redis
xiao--xin1 小时前
LeetCode100之组合总和(39)--Java
java·开发语言·算法·leetcode·回溯