与String.substring
的效果考虑相关的问题。在Java 1.7.0_06之前,String.substring()
方法返回一个新的String
对象,该对象与其父项共享相同的底层char数组,但具有不同的偏移量和长度。为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写这样的代码:
s = new String(queryReturningHugeHugeString().substring(0,3));
从1.7.0_06开始,没有必要创建新的String
,因为在Oracle的String
实现中,子字符串不再共享其底层字符数组。
我的问题是:我们可以依赖Oracle(以及其他供应商)在未来的某个版本中不返回char[]
共享,只需执行s = s.substr(...)
,或者我们是否应该显式创建一个新的String如果JRE的未来版本再次开始使用共享实现?
答案 0 :(得分:7)
String
的实际表示是一个内部实现细节,因此您永远无法确定。然而,根据甲骨文工程师的公开谈话(最值得注意的是@shipilev),它不太可能被改变。这样做不仅可以解决可能的内存泄漏问题,还可以简化String内部。使用更简单的字符串,可以更轻松地实现许多优化技术,例如String deduplication或Compact Strings。