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

相关推荐
佛系打工仔13 分钟前
绘制K线第一章:可见区间处理
java
wangkay8818 分钟前
【Java 转运营】Day02:抖音直播间流量底层逻辑全解析
java·新媒体运营
5***b9730 分钟前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
AIGCExplore1 小时前
Jenkins 全局配置及工具验证教程
java·servlet·jenkins
qq_318121591 小时前
Java大厂面试故事:Spring Boot、微服务与AI场景深度解析
java·spring boot·redis·微服务·ai·kafka·spring security
玛丽莲茼蒿1 小时前
javaSE 集合框架(五)——java 8新品Stream类
java·开发语言
程序员小假1 小时前
设计一个支持万人同时抢购商品的秒杀系统?
java·后端
L***d6701 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
C雨后彩虹1 小时前
竖直四子棋
java·数据结构·算法·华为·面试
疾风sxp1 小时前
nl2sql技术实现自动sql生成之langchain4j SqlDatabaseContentRetriever
java·人工智能·langchain4j