在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
的新对象。
所以:
collectMap
这个新映射是分配在不同的内存地址上的。- 映射中的每个键值对(Key-Value)所对应的
List<User>
是新的列表实例,它们包含了指向userList
中原有User对象的引用。 - 如果你修改了
collectMap
中的User对象属性,由于引用共享,这些更改也会反映在原始userList
中对应的User对象上。 - 但是,如果你添加或删除
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集合元素值也会变。