使用java的Stream流进行Collectors.groupingBy分组后生成Map,对Map进行删除原集合是否会发生改变

在Java中,当我们使用Collectors.groupingBy方法对集合进行分组操作时,生成的新映射(Map)是基于原始集合(allItems)的数据结构和内容创建的。这意味着,如果你更改了新的映射allItemMap中的值(例如,修改了List的内容),这不会直接影响到原始集合allItems

但是,如果FinFreightItemR对象本身是可变对象,并且你在映射中的列表中直接修改了这些对象的属性,那么虽然allItems集合本身没有变化(集合内的引用没有改变),但通过这个引用指向的对象内容已经被修改,所以看起来就像是原始集合也发生了变化。

总的来说,对于原始集合allItems,其元素的引用不会因为映射allItemMap的更改而改变,但如果修改了这些引用所指向的对象内容,则会看到原始集合中相应对象内容的变化。

还有·就是在这个Java 8的流式处理操作中,.collect(Collectors.groupingBy(User::getProfitmonth))会创建一个新的Map实例collectMap,该映射基于原始集合userList中的元素进行分组。虽然新的映射中的列表(List)包含的是引用到原始userList中User对象的地址,但映射本身以及在映射内部创建的新列表结构都是独立于原userList的新对象。

所以:

  1. collectMap这个新映射是分配在不同的内存地址上的。
  2. 映射中的每个键值对(Key-Value)所对应的List<User>是新的列表实例,它们包含了指向userList中原有User对象的引用。
  3. 如果你修改了collectMap中的User对象属性,由于引用共享,这些更改也会反映在原始userList中对应的User对象上。
  4. 但是,如果你添加或删除collectMap中的元素,这不会影响到原始userList的大小和内容。
    以下是一段实例代码:
 List<User> userList=new ArrayList<>();User user=new User();user.setName("wxl");user.setAmount(new BigDecimal("28000"));user.setProfitmonth("2024-04");user.setUploadFileName("12-1 HAI SU 7.pdf");User user1=new User();user1.setName("wxl");user1.setAmount(new BigDecimal("28000"));user1.setProfitmonth("2024-05");user1.setUploadFileName("12-1 HAI SU 7.pdf");User user2=new User();user2.setName("wxl");user2.setAmount(new BigDecimal("32000"));user2.setProfitmonth("2024-06");user2.setUploadFileName("12-1 HAI SU 7.pdf");userList.add(user);userList.add(user1);userList.add(user2);System.out.println(userList);Map<String, List<User>> collectMap = userList.stream().collect(Collectors.groupingBy(User::getProfitmonth));System.out.println(collectMap);List<User> list = collectMap.get("2024-06");list.get(0).setUploadFileName("su7.pdf");collectMap.remove("2024-04");System.out.println(collectMap);System.out.println(userList);

我们可以看到运行结果是:
在这里插入图片描述
可以看到在Map中删除数据之后,原List集合中的数据是没有变删除的;但是如果对元素进行修改的话,那原来的List集合元素值也会变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/513168.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车牌定位识别企业版

车牌定位识别企业版&#xff0c;只需要OPENCV&#xff0c;采用YOLOV8NANO检测车牌区域&#xff0c;然后使用PADDLE OCR检测车牌&#xff0c;能识别各国车牌&#xff0c;支持C,PYTHON开发 车牌定位识别企业版&#xff0c;只需要OPENCV&#xff0c;支持C,python

力扣大厂热门面试算法题 - 动态规划

爬梯子、跳跃游戏、最小路径和、杨辉三角、接雨水。每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.05 可通过leetcode所有测试用例。 目录 70. 爬楼梯 解题思路 完整代码 Python Java 55. 跳跃游戏 解题思路 完整代码 Python 代码…

RabbitMQ如何实现消费端限流

什么是消费端限流&#xff0c;这个一种保护消费者的手段&#xff0c;假如说&#xff0c;现在是业务高峰期了&#xff0c;消息有大量堆积&#xff0c;导致MQ消费需要不断的进行消息消费&#xff0c;很容易被打挂&#xff0c;甚至重启之后还是会被大量消息涌入&#xff0c;继续被…

Android APK包反编译为java文件教程

方法 流程&#xff1a; test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下&#xff0c;并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

Linux Watchdog 机制是什么

当涉及到Linux操作系统的稳定性和可靠性时&#xff0c;Linux Watchdog机制是一个至关重要的议题。该机制旨在监控系统状态&#xff0c;确保在出现问题时采取适当的措施以维持系统的正常运行。本文将深入探讨Linux Watchdog机制的工作原理、应用范围以及如何配置和使用该机制来提…

Ubuntu下安装Scala

前言 弄了一下终于成功装上了&#xff0c;这里对此进行一下总结 安装虚拟机 VMware虚拟机安装Ubuntu&#xff08;超详细图文教程&#xff09;_vmware安装ubuntu-CSDN博客https://blog.csdn.net/qq_43374681/article/details/129248167Download Ubuntu Desktop | Download | …

如何管理系统中的敏感数据?

如何管理系统中的敏感数据&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 如何在系统中管理敏感数据&#xff1f;下图列出了一系列指导原则。 什么是敏感数据&#xff1f; 个人身份信息 (PII)、健康信息、知识产权、财务…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑&#xff0c;自动识别开发板端口&#xff0c;选择端口

激光炸弹 刷题笔记

前置知识 二维前缀和 子矩阵的和 刷题笔记 {二维前缀和}-CSDN博客 思路 参考二维前缀和 将子矩阵的和 做成动态矩阵 一个个矩阵搜索 符合要求边长 矩阵中的元素和最大值 将x1,y1用i-k,j-k表示即可 x2,y2用i&#xff0c;j表示 代码 #include<iostream> #include<…

挑战与机遇:人工智能领域的关键技术与创新路径

人工智能&#xff08;AI&#xff09;作为当今世界最具活力和前景的领域之一&#xff0c;已经深刻改变了我们的生活和工作方式。然而&#xff0c;尽管AI技术近年来发展迅速&#xff0c;但其核心技术却极其稀缺。在这个领域里&#xff0c;企业们应该把重心放在哪些方面&#xff0…

android开发教程视频,android组件化和插件化

第一阶段&#xff1a;Android 基础知识回顾&#xff1a; 回顾Android 开发编程&#xff0c;深入理解Android系统原理和层次结构&#xff0c;深入分析Handler源码和原理&#xff1b;回顾Java&#xff0c;C/C&#xff0c;Kotlin、dart 在Android开发中必用的语言&#xff0c;熟悉…

洛谷:P3068 [USACO13JAN] Party Invitations S(枚举、前缀和)

这题我们数据范围太大&#xff0c;用二维肯定是不行的&#xff0c;我们可以采用一维线性存储。 如题意&#xff0c;我们可以将每组奶牛编号都存在一维数组里面&#xff0c;只需记录每组的头尾指针就可以了。 如题中样例我们就可以存储成1 3 3 4 1 2 3 4 5 6 7 4 3 2 1 然后第…