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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道经典面试题:字符串在Java中如何通过“引用”传递相关的知识,希望对你有一定的参考价值。

技术图片

这是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中如何通过“引用”传递的主要内容,如果未能解决你的问题,请参考以下文章

那晚征服的一道js经典的面试题

Java 死锁相关的一道经典面试题

Java类与对象初始化的过程(一道经典的面试题)

解析js中作用域闭包——从一道经典的面试题开始

关于Java类加载双亲委派机制的思考(附一道面试题)

经典面试题之——如何自由转换两个没有继承关系的字段及类型相同的实体模型,AutoMapper?