java - Java - 当新字符串等于旧字符串时,为什么 substring() 不创建新对象?
问题描述
例如
String oldstr, newstr;
oldstr = "hello";
如果我采用不相等的子字符串,它显然会创建一个新对象:
newstr = oldstr.substring(0,3);
但如果我采用相等的子字符串,它不会:
newstr = oldstr.substring(0);
因为这相当于做:
newstr = oldstr;
System.identityHashCode(newstr) == System.identityHashCode(oldstr)
这是真实的
那么,为什么 substring() 方法在值相同时不创建新对象(例如,创建具有不同引用位置但值相同的不同对象)?
解决方案
因为没有理由这样做,因为字符串是不可变的。
通常返回对象的相同副本的唯一原因是该对象是否可以修改。如果两段代码对一个对象具有相同的引用,然后一段代码修改了该对象,另一段代码将看到该更改。如果这是不可取的,那么解决方案是制作对象的第二个副本。然后,当一段代码更改它的对象副本时,另一个代码引用的副本保持不变。
由于字符串一旦创建就无法修改,因此不会出现在两段代码之间隔离对字符串的更改的问题,因此没有理由不让两段代码共享相同的引用到单个对象。