Java中的字符串支持某些方法(如substring)的结构共享,这意味着不需要复制所谓的不可变数据(这意外地)保持大的char数组处于活动状态,否则这些数组本来就是GC.)
此功能通过两个字段offset和count实现,这些字段在String中以字符串形式进行相应设置.
考虑到.NET doesn’t do this并声称“如果n不会变大”,“O(n)是O(1)”,那么Strings的设计是否有意义可以满足这两个要求?
E. g.有一个密封的,内存有效的通用版本的String,它没有这些多余的字段和子类“SubString”只有子字符串方法返回并具有避免复制的附加字段才有意义吗?
粗略草图:
sealed class String {
val codeunits: Array[Char] = ...
def length = codeunits.length
def substring: SubString = ...
...
}
final class SubString extends String {
val offset: Int = ...
override def length = codeunits.length - offset /* and so on */
...
}
最佳答案 您的建议可以使常见情况在内存和CPU方面更有效.
您可能有兴趣知道JVM可以在不更改代码的情况下更改此内容.当字符符合字节而没有丢失时,Sun / Oracle JVM当前自动使用byte [].
在任何情况下,你希望JVM透明地为你做的事情,比如-XX:UseCompressedStrings.