String.substring()制作底层char 值的副本

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实现中,子串不再共享其底层char数组。

我的问题是:我们可以依赖Oracle(和其他供应商)在未来的某个版本中不返回char[]共享,只需执行s = s.substr(...) ,或者我们应该只显式创建一个新的String如果JRE的未来版本再次开始使用共享实现?

String的实际表示是一个内部实现细节,因此您永远无法确定。 然而,根据甲骨文工程师的公开谈话(最着名的是@shipilev ),它不太可能被改变。 这样做不仅可以解决可能的内存泄漏,还可以简化String内部。 使用更简单的字符串,可以更轻松地实现许多优化技术,如字符串重复数据删除或紧凑字符串 。