java形参和实参的区别

以下记录自己遇到过的坑

先来看这样一个例子

 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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值