Java中String的 "引用" 传递

1、来看一段有趣但又让人困惑的代码片段

public static void main(String[] args){
        String x = new String("ab");
        change(x);
        System.out.println(x);
    }
    
    public static void change(String x){
        x = "cd";
    }

打印结果:"ab"

2、这段代码真正做了什么呢?来解释一下这个过程

首先,当字符串"ab"被创建时,Java分配内存来存储这个字符串常量;然后,这个字符串常量被赋值给了变量x,x实际上保存的是这个字符串对象的引用地址(内存中的地址);x变量保存了字符串对象的引用,x并不是引用本身,它仅仅保存的是内存的引用地址;

而在Java中,都是“值传递”;当x传递给change()方法时,实际上传递的是变量 x 的拷贝;change()方法又创建了一个新的字符串对象"cd",并赋值给了变量x的拷贝,"cd"对象的内存引用地址是不同的!

3、怎么解决这个问题呢?

如果我们确实希望改变这个对象。首先这个对象必须是可变的;第二,需要保证不会创建新的对象赋值给参数变量,因为Java仅仅是值传递

public static void main(String[] args) {
    StringBuilder x = new StringBuilder("ab");
    change(x);
    System.out.println(x);
    }
     
    public static void change(StringBuilder x) {
        x.delete(0, 2).append("cd");
    }

 

转载于:https://www.cnblogs.com/lianliang/p/5328850.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值