java – 为每个String实例“浪费”8个字节的偏移/计数是否有意义?

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.

点赞