buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

来说一个技术点,List作为参数数据丢失问题

下面方法,执行foo1,结果会是什么?

private void foo1() {
    List<String> list =new ArrayList<>();
    foo2(list);
    System.out.println("---outside="+list);
}

private void foo2(List<String> list) {
    list = Arrays.asList("123", "dsf");
    System.out.println("---internal="+list);
}

结果如下。 调用foo2之后,list的值依然是空集合。

---internal=[123, dsf]
---outside=[]

 

你是不是以为list应该是[123,dsf]呢? 那就错了。

来看看IDE中这个foo2,list参数是灰色。并且,IDE还提示你,这种情况可以把list作为局部变量。

 

根据IDE提示

重构后→

 

 

这是java的一个基础知识点。 当List作为方法入参时,你在方法里可以改变List中的元素,包括增减元素,但是不能给List对象重新赋值。严格来说,对于引用类型来说,当引用对象作为方法参数时,我们在方法内部只可更改内存中的内容,但不可变更内存地址。 下面的案例同样证明了这一点。

private void foo1() {
    Account entity=null;
    foo2(entity);
    System.out.println("---outside="+entity);
}

private void foo2(Account obj) {
    obj=new Account();
    System.out.println("---internal="+obj);
}

结果输出的是:

---internal=Account(id=null, accountId=null, accountName=null, ...)
---outside=null

 

posted on 2023-03-24 16:56  buguge  阅读(206)  评论(0编辑  收藏  举报