java中字符串的传递

原文链接:点击这里

1、先来一段代码:

public class StringValue {

    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、不应该输出 cd 吗?

x存储指向堆中“ab”字符串的引用。因此,当x作为参数传递给change()方法时,它仍然指向堆中的“ab”,如下所示:

 

 

 

 

 

因为java是按值传递,所以x的值是对ab的引用。当调用方法change()时,它会创建一个新的cd对象,而x现在指向cd。如下所示:

 

 

 

 

 

这么解释,似乎没毛病!

3、这段代码到底做了什么?

创建字符串ab时,Java会分配存储字符串ab对象所需的内存量。然后将对象分配给变量x,实际上x被赋予对象的内存地址
变量x包含对字符串对象的引用。x本身是一个存储ab内存地址的变量。
Java只是按值传递。当x传递给change()方法时,将传递x(引用)值的副本。方法change()创建另一个对象cd,它有一个不同的引用地址。然后更改变量x其地址为cd,而没有改变原先引用的字符串ab的地址。如图:

 

 

 

 

 

个人理解:假如老王现在在荷兰【x】,公司人事听成了河南【change(x)】。但其实老王人一直在荷兰!

 

4、错误的解释

从第一个代码片段引发的问题与字符串不变性无关。即使String被StringBuilder替换,结果仍然相同。关键是变量存储引用地址,但不是引用本身!

5、问题解决

如果我们真的需要改变对象的值。首先,对象应该是可更改的,例如StringBuilder。其次,我们需要确保没有创建新对象并将其分配给参数变量,因为Java只是按值传递。

public class StringValue {

    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://my.oschina.net/imlim/blog/1973484

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值