java值传递和引用传递
ps:
碰到一个业务bug,抛出异常unsupportedoperationexception,检查代码发现在调用链中,lista=immutablelist.of(xxx);导致lista为不可变list,调用retain()方法抛出异常;
// 原始代码 …… lista.retainall(listb); // 修改代码1 lista = lista.stream().filter(listb::contains).collector(collectors.tolist); ……
然后我修改:
lista = new arraylist<>(); lista.add(xxx);
- 因为处理过程有好几个分支,为了避免后续其他地方有lista=immutablelist.of(xxx);此类情况,所以我修改了retain为stream().filter();
- 然后调试发现值lista修改失败;
- 还原为lista.retainall(listb);修改成功;
原因
java方法参数均为值传递
参数为基本类型
public class main { public static void main(string[] args) { // 创建一个整数变量并赋值 int number = 10; // 调用方法并将number传递进去 changenumber(number); // 输出原始变量的值,仍然是10,未被方法改变 system.out.println(number); // 输出: 10 } // 定义一个方法,尝试改变参数的值 public static void changenumber(int num) { num = 20; // 这里只是改变了方法内部副本的值 } }
参数为引用类型
- 引用类型其实传递到方法的其实是引用地址的值,两个引用变量都指向原对象;
- 所以object.value = xxx;会修改值;
- 而object = new object()其实只是修改了当前方法入参的引用对象,而原对象未被修改
public class main { public static void main(string[] args) { // 创建一个对象 myobject obj = new myobject(); obj.value = 10; // 调用方法并将对象传递进去 changeobject(obj); // 输出对象的值,已被方法改变 system.out.println(obj.value); // 输出: 20 // 调用set方法 setobject(obj); // 输出对象的值,值不变 system.out.println(obj.value); // 输出: 20 } public static void changeobject(myobject obj) { obj.value = 20; // 这里修改的是对象的实际状态 } public static void setobject(myobject obj) { obj= new myobjectc(); // 这里修改的是对象的实际状态 } static class myobject { int value; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论