集合作为函数参数传参时创建新集合对象的作用

简介: 易错点——List集合集合作为函数参数传参时创建新集合对象的作用

List集合易错点

在使用List集合嵌套集合时,经常会看到这样的代码:

List<Integer> list = new ArrayList<Integer>();
        
        //一些对list集合的操作
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();

        res.add(new ArrayList<Integer>(list));

大家可能会有疑问 为什么不是res.add(list)呢? 这样再new ArrayList(list)是否多余呢? 我们先来简单写下代码,看看结果:
1.第一种写法

class Main{
public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(list);    
        System.out.println("res: "+res);
        System.out.println("list: "+list);
        
    //运行结果    
    //       res: [[1, 2]]
    //     list: [1, 2]
    }    
}

2.第二种写法

class Main{
public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(new ArrayList<Integer>(list));    
        System.out.println("res: "+res);
        System.out.println("list: "+list);
        
    //运行结果    
    //       res: [[1, 2]]
    //     list: [1, 2]
    }    
}

发现结果是相同的,但是真的相同吗?我们再对list集合进行一些操作继续测试

class Main{
public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(list);    
        list.clear();
        System.out.println("res: "+res);
        System.out.println("list: "+list);
        
    //运行结果    
    //       res: [[]]
    //     list: []
    }    
}
class Main{
public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(new ArrayList<Integer>(list));        
        list.clear();
        System.out.println("res: "+res);
        System.out.println("list: "+list);
        
    //运行结果    
    //  res: [[1, 2]]
   //   list: []
    }    
}

对list进行清空的操作会发现两种写法的结果不再相同了,出现这样的原因在于,res.add(list) 这种写法是将list对象直接添加到res集合中,此时我们对list集合的修改也会改变res集合中所添加list集合的值。

而如果是res.add(new ArrayList <Integer> (list)); 此时res集合添加的一个新的与list集合所存储数据元素相同的集合,这个时候再对list集合进行修改是不会影响res集合的。

由此可见,一个集合是一个对象也就是对应一个地址值,不同集合存储的元素可能相同,但是对应地址值不同。如果对一个集合进行修改,那么以这个集合作为元素数据的集合所对应的元素数据也会被修改(地址值相同)。

相关文章
|
XML 数据格式 网络架构
|
算法 调度 UED
深入浅出操作系统调度策略
【10月更文挑战第33天】在数字时代的心脏,操作系统扮演着至关重要的角色。本文将探讨操作系统的核心功能之一——进程调度策略的设计与影响。我们将从理论到实践,通过浅显易懂的语言和具体代码示例,揭示如何通过不同的调度算法来优化系统性能和用户体验。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
算法 开发者
编码之旅:从新手到专家的技术成长之路
在编程的海洋中,每一位开发者都曾是一名初学者。本文将带你穿越技术的迷宫,探索如何从一名对代码一无所知的新手成长为一个能够熟练解决问题的专家。我们将一起回顾那些关键的学习阶段、面对的挑战以及突破瓶颈的策略,从而揭示技术成长的不二法门。
|
人工智能 监控 搜索推荐
智能增强:AI技术在教育领域的革新之路
【7月更文挑战第15天】随着人工智能(AI)技术的飞速发展,其在教育领域的应用已逐步深入,从个性化学习计划到智能评估系统,AI正在重塑传统的教学模式。本文将探讨AI如何通过智能教学辅助、学习数据分析和自适应学习平台等方面,为教育领域带来革命性的变化,同时也会讨论这些技术发展所面临的挑战与未来趋势。
206 0
|
机器学习/深度学习 人工智能 Serverless
Serverless 应用引擎产品使用合集之在外网访问提示为无效SSL证书,如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
存储 NoSQL 安全
Redis入门到通关之数据结构解析-动态字符串SDS
Redis入门到通关之数据结构解析-动态字符串SDS
212 0
autojs之大柒侧滑栏详解
用场景 解析 大柒 侧滑栏
792 0
autojs之大柒侧滑栏详解
|
Cloud Native Java 应用服务中间件
带你读《Apache Tomcat的云原生演进》——Web容器可观测最佳实践(3)
带你读《Apache Tomcat的云原生演进》——Web容器可观测最佳实践(3)
314 0
带你读《Apache Tomcat的云原生演进》——Web容器可观测最佳实践(3)
|
SQL 存储 分布式计算
从方法到思维:什么是应用逻辑架构的正确姿势?(上)
本文分享阿里资深技术专家六铢的架构方法论,这套方法论中包含了详细的架构推导逻辑,希望能够帮助大家在工作中从各个粒度、各个层次来做好架构工作。较长,同学们可先收藏再看。
2606 2
从方法到思维:什么是应用逻辑架构的正确姿势?(上)
|
Linux Windows
Linux系统中如何识别插入的U盘等外部设备
Linux系统中如何识别插入的U盘等外部设备
559 0