为何更新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
相关产品推荐
相关产品推荐

