一道经典面试题:字符串在Java中如何通过“引用”传递

2021-04-09 13:25

阅读:547

标签:另一个   不同   答案   最好   结果   调用   this   创建   字符   

技术图片

这是Java的一个经典问题。

stackoverflow上也有很多类似的问题,有很多不正确/不完整的答案。

如果你想的不多,问题很简单。

但如果你多想想,可能会很困惑。

一、一个有趣且令人困惑的代码片段

技术图片

在c++中,代码如下:

技术图片

二、常见的混淆问题

x在堆中存储指向“ab”字符串的引用。

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

技术图片

因为java是按值传递的,所以x的值是对“ab”的引用。

当方法change()被调用时,它创建一个新的“cd”对象,x现在指向“cd”,如下所示:

技术图片

这似乎是一个相当合理的解释。

很明显,Java总是按值传递。

但这里出了什么问题?

三、代码的真正作用是什么

上面的解释有几个错误。

为了更容易理解这一点,最好简单地浏览一下整个过程。

创建字符串“ab”时,Java分配存储字符串对象所需的内存量。

然后,对象被赋值给变量x,变量实际上被赋值为对象的一个引用。

此引用是存储对象的内存位置的地址。

变量x包含对字符串对象的引用。

x本身不是一个引用!

它是一个存储引用(内存地址)的变量。

Java只是按值传递。

当将x传递给change()方法时,将传递x值的副本(引用)。

方法change()创建另一个对象“cd”,它有一个不同的引用。

是变量x改变了它的引用(变成“cd”),而不是引用本身。

下图显示了它的实际功能。

技术图片

四、The wrong explanation

第一个代码片段引发的问题与字符串不变性无关。

即使String被StringBuilder替换,结果还是一样的。

关键是变量存储引用,而不是引用本身!

五、Solution to this problem

如果我们真的需要改变对象的值。

首先,对象应该是可变的,例如StringBuilder。

其次,我们需要确保没有创建新对象并将其分配给参数变量,因为Java只传递值。

技术图片

写在最后

欢迎大家关注我的公众号【风平浪静如码】,海量Java相关文章,学习资料都会在里面更新,整理的资料也会放在里面。

觉得写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

一道经典面试题:字符串在Java中如何通过“引用”传递

标签:另一个   不同   答案   最好   结果   调用   this   创建   字符   

原文地址:https://blog.51cto.com/14570694/2513063


评论


亲,登录后才可以留言!