首页 > 解决方案 > 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() 方法在值相同时不创建新对象(例如,创建具有不同引用位置但值相同的不同对象)?

标签: javasubstringidentity

解决方案


因为没有理由这样做,因为字符串是不可变的。

通常返回对象的相同副本的唯一原因是该对象是否可以修改。如果两段代码对一个对象具有相同的引用,然后一段代码修改了该对象,另一段代码将看到该更改。如果这是不可取的,那么解决方案是制作对象的第二个副本。然后,当一段代码更改它的对象副本时,另一个代码引用的副本保持不变。

由于字符串一旦创建就无法修改,因此不会出现在两段代码之间隔离对字符串的更改的问题,因此没有理由不让两段代码共享相同的引用到单个对象。


推荐阅读