最近在看mybatis源码发现一个有意思的方法,我一直直观的认为一个方法必须返回一个值给参数,才能改变参数的值,么想到可以这样写
//想要修改这个map的值
public static void main(String[] args) {
Map<Integer, List<Integer>> map = new HashMap<>();
Stream.iterate(1, i -> i +1).limit(10).forEach(key ->{
List<Integer> integers = map.computeIfAbsent(key, k -> new ArrayList<>());
integers.add(key);
// integers = new ArrayList<>(); //不能
// conflicting = new HashMap<>(); //不能
// integers = null; //不能
// integers.clear(); //能
// integers.add(name);
});
System.out.println(map);
}
结果 {1=[1], 2=[2], 3=[3], 4=[4],5=[5],
6=[6], 7=[7], 8=[8], 9=[9],10=[10]}
map里面的东西都是引用类型,只有在不改变引用的情况下修改这个integers数组的值才能改变map,
当你 new ArrayList的时候 其实引用已经改变了,虽然名字不变,但是操作的对象已经变了
有个人说的很明白,使用 = 才能使对象的引用改变