有关性能考量的问题String.substring
。在Java 1.7.0_06之前,该String.substring()
方法返回一个新String
对象,该对象与其父对象共享相同的基础char数组,但偏移量和长度不同。为了避免在只需要保留小的子字符串时在内存中保留非常大的字符串,程序员习惯于编写如下代码:
s = new String(queryReturningHugeHugeString().substring(0,3));
从1.7.0_06开始,不再需要创建新String
的String
字符串,因为在Oracle的实现中,子字符串不再共享其基础char数组。
我的问题是:我们可以依靠Oracle(和其他供应商)char[]
在将来的某些发行版中不回过头来共享,而是简单地这样做吗?s = s.substr(...)
还是应该明确创建一个新的String,以防JRE的某些将来发行版开始使用共享实现?再次?
的实际表示形式String
是内部实现细节,因此您无法确定。但是,根据Oracle工程师的公开谈话(最著名的是@shipilev),将其改回的可能性很小。这样做不仅是为了防止可能的内存泄漏,而且是为了简化String内部。使用更简单的字符串,可以更轻松地实现许多优化技术,例如String Deduplication或Compact Strings。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句