以下记录自己遇到过的坑
先来看这样一个例子
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("小花");
a.add("小明");
List<String> b = new ArrayList<>();
b.add("xixi");
b.add("haha");
System.out.println("---------调用update方法前实参的值(实参)---------");
System.out.println("调用方法前a的值:"+a);
System.out.println("调用方法前b的值:"+b);
update(a, b);
System.out.println("---------调用update方法后实参的值(实参)---------");
System.out.println("调用方法后a的值:"+a);
System.out.println("调用方法后b的值:"+b);
}
public static void update(List<String> a, List<String> b){
List<String> c = new ArrayList<>();
c.add("123");
c.add("456");
a = c;
b.add("789");
b.remove("xixi");
System.out.println("---------update方法中形参的值(形参)---------");
System.out.println("修改后的形参a:"+a);
System.out.println("修改后的形参b:"+b);
}
控制台输出:
---------调用update方法前实参的值(实参)---------
调用方法前a的值:[小花, 小明]
调用方法前b的值:[xixi, haha]
---------update方法中形参的值(形参)---------
修改后的形参a:[123, 456]
修改后的形参b:[haha, 789]
---------调用update方法后实参的值(实参)---------
调用方法后a的值:[小花, 小明]
调用方法后b的值:[haha, 789]
总结:
1.形参只有在调用方法时存在,在调用update方法时,形参首先会获取实参的对象地址
,当update方法调用结束后,形参会释放资源。
2.形参只是和实参指向同一个
对象地址
,如果用"="连接,相当于改变了形参的地址。实参不会受影响
。
3.add和remove是改变原地址的数据
,所以实参会跟着改变,因为他们公用一个地址路径。
注:
在java8语法中利用list.stream().collect(Collectors.toList());
改变值获取的list也相当于是重新new了一个,因此不能用这种修改形参的方式来修改实参。
可以把修改后的值重复赋值给list:list = list.stream().collect(Collectors.toList());