You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:将局部字符串赋值给实例变量是否会创建新String对象?

关于Java字符串赋值与对象创建的问题拆解

好问题!咱们把这个问题拆成两部分解释,再对比你给出的代码和new String(number)的差异:

1. 直接赋值局部字符串给实例变量,会不会创建新String对象?

答案是不会。Java中的String是引用类型,当你执行this.number = number;时,只是把传入的number变量的引用地址赋值给实例变量this.number,两者最终指向堆内存中同一个String对象,并没有创建新的对象。

举个直观的例子:

String input = "123456789";
YourClass obj = new YourClass();
obj.setNumber(input);
// 这里input和obj.number指向同一个对象,==判断会返回true
System.out.println(input == obj.getNumber()); // 输出true

2. 你的代码和this.number = new String(number);完全不等同

执行new String(number)时,Java会在堆内存中新建一个独立的String对象,哪怕这个新对象的字符内容和传入的number完全一致。这时候this.number和原number指向的是两个不同的对象:

String input = "123456789";
YourClass obj = new YourClass();
// 如果把setNumber里的赋值改成new String(number)
obj.setNumber(input);
// 这里input和obj.number指向不同对象,==判断返回false
System.out.println(input == obj.getNumber()); // 输出false

回到你给出的代码:

public void setNumber(String number){ 
    if(number == null || number.length() != 9) return; 
    this.number = number; 
}

这段代码只是做了参数合法性校验,然后直接传递引用,完全没有创建新String对象的逻辑,和new String(number)的行为天差地别。

额外补充:为什么通常不需要用new String(number)?

因为Java的String是不可变类,一旦创建就无法修改内部字符内容。所以即使多个引用指向同一个String对象,也不用担心被意外修改的问题。只有在极少数特殊场景下(比如早年Java版本中想把字符串从常量池移到堆内存,或者需要刻意断开引用关联),才会用到new String()的方式,日常开发中直接赋值引用就足够安全高效。

内容的提问来源于stack exchange,提问作者João Rodrigues

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:23:33