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
相关产品推荐
相关产品推荐

