You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何更新Map中List值后需调用put?与Arrays.sort的区别解析

关于Map中List操作与数组排序的疑问解答

一、getOrDefault返回的是引用还是副本?

map.getOrDefault(arr[i], new ArrayList<String>())返回的是对象引用,绝非副本:

  • 如果指定key已存在于Map中,返回的就是Map里存储的那个List对象的引用;
  • 如果key不存在,会创建一个全新的ArrayList对象,返回这个新对象的引用。

拿代码里的场景举例:第一次循环处理"one"时,Map里没有这个key,所以生成一个新ArrayList,list变量指向这个对象。你对list调用add只是修改了这个对象的内容,但此时这个对象还没被存入Map——如果不执行map.put,Map里永远不会有"one"对应的条目,这个新对象后续会被垃圾回收。

二、为什么Map操作需要调用put,而Arrays.sort无需重新赋值?

核心区别在于对象是否已经被目标容器持有,以及操作是修改对象本身还是替换引用:

1. Map场景的特殊情况

当你通过getOrDefault拿到List时,分两种情况:

  • 如果key不存在:拿到的是一个未被Map托管的新List对象,你修改它的内容后,必须通过put把这个对象的引用存入Map,才能让Map记住这个条目;
  • 如果key已存在:拿到的是Map中已有List的引用,此时修改List内容(比如add)会直接改变Map里的对象,这时候put其实是多余的——但代码里统一写put是为了覆盖key不存在的场景,避免遗漏。

2. Arrays.sort的原地修改特性

数组是引用类型,input_arr是指向数组对象的引用。Arrays.sort(input_arr)是原地修改数组本身:它直接对引用指向的数组对象内部元素进行排序,不会创建新的数组。所以排序完成后,原来的input_arr引用指向的还是同一个数组,但里面的元素已经是排序后的状态,自然不需要重新赋值。


内容的提问来源于stack exchange,提问作者user9174081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:13:16