博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中String是“引用”传递
阅读量:6307 次
发布时间:2019-06-22

本文共 1173 字,大约阅读时间需要 3 分钟。

如题,在java中这是一个典型的问题。 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案。如果你不往深处想,这是一个很简单的问题。但如果深入思考,它却很让人迷惑。

1. 下面是一段很有意思并且让人迷惑的代码

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. 通常让人迷惑的解释如下

在java堆中x存储指向“ab”的引用。所以当x作为参数传递给change()方法时,它在内存中仍然指向“ab”,如下:

string-pass-by-reference

由于java是值传递,所以此时x仍然指向“ab”。当chang()方法执行时,它在内存中创建了一个新的String对象“cd”,并且现在x指向“cd”,如下:

string-pass-by-reference 2

上面的解释看起来非常合理。他们也很清楚java是值传递。但是哪里出错了?

3. 上面的代码到底如何执行的呢?

上面的解释有几处错误。跟踪代码执行全过程是一个很好的方法,并且理解起来很容易。

当“ab”创建后,java分配对象所需内存空间。然后,变量x指向了“ab”,变量实际上是指向对象的引用。这个引用指向对象存储的地址。

x保存了一个指向String对象的地址。x不是引用本身!它是保存一个内存地址。

在Java中只有值传递。当x通过参数传递给change()方法后,x被拷贝了一份。change()创建了另一个对象“cd”,并且x指向了不同的地址空间。实际上是x改变它的引用(指向“cd”),不是x本身。

下图展示了x在内存的变化

string-pass-by-reference 3

 

4. 错误的解释

上面的问题跟String的不可变没有关系。即使是StringBuilder,结果也一样。关键是变量存储的是引用,而不是引用本身!他饶啦

5. 解决问题

如果真的要改变对象的值。首先,对象应该是可变的,如StringBuilder,另外,我们要确认没有新对象生成并且赋予参数变量,因为java只有值传递

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://www.cnblogs.com/zeng-wei/p/3494336.html

你可能感兴趣的文章
idea springboot热部署无效问题
查看>>
第八章 进程间通信
查看>>
HttpSession接口中的方法(Jsp中的session类的用法)
查看>>
「镁客早报」AI可预测心脏病人死亡时间;机器人开始在美国送外卖
查看>>
MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
查看>>
物联网全面升级,十年内推动工业进入智能化新阶段
查看>>
spring-通过ListFactory注入List
查看>>
一种基于SDR实现的被动GSM嗅探
查看>>
阿里云ECS每天一件事D1:配置SSH
查看>>
SQL Server 性能调优(性能基线)
查看>>
uva 10801 - Lift Hopping(最短路Dijkstra)
查看>>
[Java Web]servlet/filter/listener/interceptor区别与联系
查看>>
POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
查看>>
从零开始学MVC3——创建项目
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>
延时任务和定时任务
查看>>
linux下的权限问题
查看>>
教你如何使用Flutter和原生App混合开发
查看>>
Spring Boot 整合redis
查看>>
CSS hover改变背景图片过渡动画生硬
查看>>