簡體   English   中英

每個String實例“浪費” 8個字節的偏移量/計數是否有意義?

[英]Does it make sense to “waste” 8 bytes per String instance for offset/count?

Java中的字符串支持某些方法的結構共享,例如substring ,這意味着假定不可變的數據不需要被復制((意外地)使大型char數組保持活動狀態,否則可以通過GC將其保存。)

此功能由兩個字段offsetcount實現,當在Java中將String substring時,可以相應地設置offsetcount

考慮到.NET不能做到這一點,並聲稱“如果n不變大,則O(n)為O(1)”,那么略微不同的String設計是否可以滿足兩個要求?

例如 有一個密封的,內存有效的,通用的String版本,它沒有這些多余的字段,而一個子類“ SubString”僅由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一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM