[英]Does it make sense to “waste” 8 bytes per String instance for offset/count?
Java中的字符串支持某些方法的結構共享,例如substring
,這意味着假定不可變的數據不需要被復制((意外地)使大型char數組保持活動狀態,否則可以通過GC將其保存。)
此功能由兩個字段offset
和count
實現,當在Java中將String substring
時,可以相應地設置offset
和count
。
考慮到.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.