您现在的位置是:亿华云 > 系统运维
在Java中字符串是通过引用传递的?
亿华云2025-10-05 18:32:43【系统运维】3人已围观
简介1. 一段有趣但令人困惑的代码 public static void main(String[] args) { String x
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"
C++ 代码如下:
void change(string &x) {
x = "cd";
}
int main(){
string x = "ab";
change(x);
cout << x << endl;
}
输出 "cd"
2.经常让人捉摸不透的问题
x 存储了堆中"ab"字符串的引用。因此,符串当x作为参数传递到change()方法的通过时候,它仍然堆中的引用"ab",如下所示:
因为java是按值传递的,x的传递值是"ab"的引用。当方法change()被调用的中字时候,它创建了一个新的符串字符串对象"cd" ,然后x就指向了"cd" ,通过如图所示:
这似乎是引用一个非常合理的解释。他们很清楚,传递java是中字按值传递的,但是符串这里出了什么问题?
3.这段代码到底做了什么?
上面的解释有几处错误。为了更容易理解,通过我们最好简单的引用过一下整个流程。
当字符串"cd" 被创建时,亿华云计算传递java会分配储存字符串所需要的内存量。然后,对象被分配给了变量x,实际上是将对象的引用分配给了变量x。这个引用是对象储存的内存地址。
变量x包含了一个指向字符串对象的引用,x并不是字符串对象本身。它是一个储存了字符串对象ab引用的变量。
java是按值传递的。当x被传递给change()方法时,实际上是x的值(一个引用)的一个副本。方法change被调用后,会创建另一个对象"cd",它有着一个不同的引用。方法内的局部变量x的值变成了"cd"的引用。这里改变的香港云服务器是方法内的局部变量的引用值,而不是改不了原先引用的字符串"ab"。
看图:
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");
}
http://shenzhen.offcn.com/
很赞哦!(755)
上一篇: 国际域名转移的费用和处理步骤是什么?
下一篇: 换新域名(重新来过)
相关文章
- 打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
- Vite使Vue CLI过时了吗?
- 关于.NET生态,你了解多少?
- K8s宣布弃用Docker,千万别慌!
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 如何基于DataWorks构建数据中台?
- 2020年 Common Lisp 使用情况调查
- 看这8个DevOps重点,提高2021 生产率
- 前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
- 一篇带给你JavaScript的Class语法介绍
站长推荐
4、club娱乐
首门编程语言很重要,初学者应该选择学习哪个呢?
连续3年稳居第一,全球1240万用户,JavaScript你还没学会?
前端算法系统练习: 链表篇完结
用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。
JDK bug?? HashMap中的死循环问题!
码德需求?这不就是产品给我留的数学作业!
2700万程序员要失业?机器编程要让全球78亿人都能写代码