这是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中如何通过“引用”传递相关推荐

  1. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  2. Java中只存在值传递

    2019独角兽企业重金招聘Python工程师标准>>> 在Java中并不存在引用传递(即地址传递),对于变量(可以是基本数据类型,也可以是引用数据类型)而言,可以理解为就是一个地址. ...

  3. 百度校招历年经典面试题汇总:Java开发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 百度校园招聘历年经典面试题汇总:C ...

  4. 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3

    备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...

  5. Java中方法参数的传递

    Java中方法参数的传递: 众所周知,Java语言中只有值传递,看起来很好理解的一句话,那么来看一个例子: 输出结果: 这是一个经典问题,我想说说自己的理解: 首先,变量sa和sb分别包含一个字符串对 ...

  6. java面试题24 关于Java中的数组,

    java面试题24 关于Java中的数组,下面的一些描述,哪些描述是准确的:(        ) A 数组是一个对象,不同类型的数组具有不同的类 B 数组长度是可以动态调整的 C 数组是一个连续的存储 ...

  7. Java中使用JSON数据传递

    一.Java中使用JSON数据传递 pom依赖引入 <dependency><groupId>com.alibaba</groupId><artifactId ...

  8. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  9. 【Java面试题】21 Java中的异常处理机制的简单原理和应用。

    [Java面试题]21 Java中的异常处理机制的简单原理和应用. 参考文章: (1)[Java面试题]21 Java中的异常处理机制的简单原理和应用. (2)https://www.cnblogs. ...

最新文章

  1. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...
  2. Git-TortoiseGit完整配置流程
  3. 简单选择排序--转载
  4. 到底什么样的ABAP系统能运行Fiori应用
  5. 【LightOJ - 1123】Trail Maintenance(在线维护最小生成树,删边思维)
  6. “欣喜”和“郁闷”交织的2006
  7. 计算机的启动盘,做win7启动盘制作方法
  8. Pizza Separation
  9. Linux静态库与动态库的概念及制作
  10. 我经历的IT公司面试及离职感受
  11. Latex编辑器Texstudio的注释快捷键。
  12. 企业微信如何自动同步外部客户信息到CRM系统
  13. 高清视音监控系统的实现
  14. 怎么看jupyter的文件保存路径
  15. 用于 Power 体系结构的汇编语言
  16. 光伏储能容量优化MATLAB论坛,微电网中电池储能的容量配置及优化
  17. shell 中的单行注释和多行注释
  18. ISO26262第二版发布
  19. NOIP 提高组 2012 / 洛谷P1080 国王游戏 题解
  20. 安装oracle过程中卡在45%不动的解决办法

热门文章

  1. 算法实践1_线性回归
  2. 深入浅出统计学(十一)总体和样本的估计
  3. 【模型评估与选择】sklearn.model_selection.train_test_split
  4. 替代离线RL?Transformer进军决策领域,「序列建模」成关键
  5. ​2021年机器学习什么风向?把注意力放在MLP上
  6. 知乎热议:28岁郭宇期权过亿,彪悍从字节退休,旅居日本开温泉酒店
  7. 面试必备:6个你必须熟练掌握的机器学习算法
  8. CSS中浮动布局float(小米布局案例、导航栏案例、overflow)
  9. Python assert断言函数及用法
  10. 有了阿里云服务器如何运行Javaweb项目【安转JDK】【安装mysql】【安装Tomcat】【永久运行】