前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java的字符串是值传递还是引用传递

Java的字符串是值传递还是引用传递

作者头像
用户2242639
发布于 2022-03-28 07:55:30
发布于 2022-03-28 07:55:30
93200
代码可运行
举报
文章被收录于专栏:Java经验总结Java经验总结
运行总次数:0
代码可运行

Java的字符串是值传递还是引用传递

这是Java的经典问题。关于stackoverflow,已经提出了许多类似的问题,并且有很多不正确/不完整的答案。如果您考虑不多,问题很简单。但是,如果您对此进行更多考虑,可能会造成混乱。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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";
}

得出来的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ab

在C ++中,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void change(string &x) {
    x = "cd";
}
 
int main(){
    string x = "ab";
    change(x);
    cout << x << endl;
}

得到的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd

2. 常见的令人困惑的问题

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

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

这似乎是一个很合理的解释。他们很清楚Java总是按值传递。但是这里有什么问题?

3. 代码实际上是做什么的?

上面的解释有几个错误。为了轻松理解这一点,最好简要介绍一下整个过程。

创建字符串"ab"时,Java会分配存储字符串对象所需的内存量。然后,该对象被分配给变量x,该变量实际上被分配了对该对象的引用。该引用是存储对象的存储位置的地址。

变量x包含对字符串对象的引用。x本身不是参考!它是一个存储引用(内存地址)的变量。

Java仅按值传递。将x传递给change()方法时,将传递x值的副本(引用)。方法change()创建另一个对象"cd",并且它具有不同的引用。是变量x更改其引用(改为"cd"),而不是引用本身。

下图显示了它的实际作用。

4.错误的解释

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

5.解决这个问题

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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");
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java经验总结 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java中值传递和引用传递
public static void main(String[] args) {int a=1;change(a);System.out.println("交换a后的值:" a);}
chenchenchen
2019/11/05
8220
面试题系列第7篇:Java方法到底是值传递还是引用传递?
这个问题一直在技术讨论区争论不休。对于初级人员来说很具有迷惑性,即便对于很多高级开发来说,也搞不清楚。本篇文章就带大家探究一下底层的原理,最终化繁为简,让大家通过一两句话就明白到底是值传递还是引用传递。
程序新视界
2020/09/08
1.1K1
为什么Java中只有值传递【详解】
这里,我们可以清晰地看出x的值在函数执行前后没有发生改变,函数对形参的任何操作,不影响实参;
訾博ZiBo
2025/01/06
670
为什么Java中只有值传递【详解】
说说Java到底是值传递还是引用传递
首先,我们必须要搞清楚,到底什么是值传递,什么是引用传递,否则,讨论 Java 到底是值传递还是引用传递就显得毫无意义。
沉默王二
2020/04/23
4580
说说Java到底是值传递还是引用传递
从一道没人能答对的面试题聊聊Java的值传递
这是一道我们公司的面试题,从招第二个Java以来就一直存在了。但是面试了这么长的时间还没有一个人可以全部答对,让我们一度以为是这题出的不对。首先请看面试题。
我的小熊不见了丶
2019/08/20
3960
从一道没人能答对的面试题聊聊Java的值传递
聊聊Java里面的引用传递
长久以来,在Java语言里面一直有一个争论,就是Java语言到底是值传递(pass-by-value)还是引用传递(pass-by-reference),有的人说是值传递,有的人说是引用传递,两边各执一词,从而误导了很多开发者,更有甚者告诉开发者说不必纠结Java到底是值传递还是引用传递,只要能用就行了,但事实真的是这样吗? 答案是否定的。
我是攻城师
2018/12/14
7480
面试官刁难:Java字符串可以引用传递吗?
老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:Java 字符串可以引用传递吗?
沉默王二
2020/02/11
5250
面试官刁难:Java字符串可以引用传递吗?
Java的参数传递是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?    答:是按值传递。Java 语言的参数传递只有按值传递。当一个实例对象作为参数被传递到方
nnngu
2018/03/15
3.3K0
Java的参数传递是值传递还是引用传递
java — 值传递和引用传递
  在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。   Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。  java实际上只有值传递,没有真正意义上的引用传递。 按值传递意味着当将一个参数传递给一
Mister24
2018/05/14
1.5K0
Java到底是引用传递还是值传递?
首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。 按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式。
黑洞代码
2021/01/14
8120
Java到底是引用传递还是值传递?
String是值传递还是引用传递
今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。
小忽悠
2018/09/04
9720
多图证明,Java到底是值传递还是引用传递?
开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文。
Bug开发工程师
2021/01/28
6310
多图证明,Java到底是值传递还是引用传递?
Java 引用传递和值传递
这个问题的关键在于 a,b,x,y 的地址指向; y = x 与 b = a 是不等价的!! 发生改变的是 y 指向的值变成了和 x 指向的相同, 此时 y = AB(因为append方法改变的x原有的值) 而此时 b 的指向并没有发生改变。
星尘的一个朋友
2020/11/25
1.2K0
浅析按值传递与按引用传递
下列关于按值传递与按引用传递的描述中,正确的是( )。A.按值传递不会改变实际参数的数值 B.按引用传递能改变实际参数的参考地址C.按引用传递能改变实际参数的内容 D.按引用传递不能改变实际参数的参考地址
田维常
2019/12/17
1.2K0
Java中的值传递与引用传递
在Java编程中,我们常常听到关于值传递和引用传递的讨论。这两个概念涉及到数据在方法之间如何传递的问题。理解这些概念对于正确编写Java程序至关重要。在本文中,我们将深入探讨什么是值传递和引用传递,以及为什么Java中只有值传递这一问题。
疯狂的KK
2023/09/07
3670
Java中的值传递与引用传递
为什么大家都说Java中只有值传递?
最近跟Java中的值传递和引用传递杠上了,一度怀疑人生。查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递。也搞明白了,为什么大家都说Java只有值传递,没有引用传递。原来,我一直以来的认知都是错误的。。。
烟雨星空
2020/06/16
1.6K0
在Java中字符串是通过引用传递的?
这是一个经典的java问题。在stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误的或不完整的。 如果你不想深入思考的话,这个问题很简单。如果你想明白的更彻底,那么问题可能容易让人迷惑不清。 1. 一段有趣但令人困惑的代码 public static void main(String[] args) { String x = new String("ab"); change(x); System.out.println(x); } public static void c
三哥
2018/06/15
6.3K3
解惑4:java是值传递还是引用传递
曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的。
全栈程序员站长
2022/09/23
6510
解惑4:java是值传递还是引用传递
Java 基础概念·Java 只有值传递
当我们调用一个有参函数的时候,会把实际参数传递给形式参数。在程序语言中,这个传递过程中有两种情况,即值传递和引用传递。
数媒派
2022/12/01
4260
Java 值传递与引用传递
以下是包含引用的完整博客文章,以markdown格式输出,附带“Java 只有值传递”的相关参考来源。
井九
2024/10/12
1680
Java 值传递与引用传递
相关推荐
java中值传递和引用传递
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文