String.substring()生成基础char []值的副本

Kli*_*cou 12 java string

有关性能考虑因素的问题String.substring.在Java 1.7.0_06之前,该String.substring()方法返回一个新String对象,该对象与其父对象共享相同的底层char数组,但具有不同的偏移量和长度.为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写如下代码:

s = new String(queryReturningHugeHugeString().substring(0,3));
Run Code Online (Sandbox Code Playgroud)

从1.7.0_06开始,没有必要创建一个新的,String因为在Oracle的实现中String,子串不再共享它们的底层char数组.

我的问题是:我们可以依赖Oracle(以及其他供应商)不再回到char[]未来的版本中共享,而只是这样做s = s.substr(...),或者我们是否应该显式创建一个新的String,以防JRE的未来版本开始使用共享实现再次?

Tag*_*eev 8

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