[英]What is the time complexity of Java StringBuilder.substring() method? If it is linear, is there a constant time complexity method to get a substring?
在我看來,它應該是恆定的(O(1))時間復雜度。 但是我被告知在調用stringBuilder.substring()方法時必須實例化一個新的String對象。 (這不是靜態方法)。 如果這是真的,我怎樣才能在恆定的時間復雜度內獲得子串?
您不可能在常量時間內從StringBuilder
創建String
並保持其不變性。 此外,從Java 7 Update 25開始,即使String#substring()
也是線性時間,因為結構共享實際上比它避免的更麻煩:巨大字符串的子字符串保留了對巨大char
數組的引用。
在我看來,它應該是恆定的(O(1))時間復雜度。
這是不可能的。 由於Java字符串是不可變的,而StringBuilder
是可變的,因此生成String
所有操作都必須復制。
如果這是真的,我怎樣才能在恆定的時間復雜度內獲得子串?
你不能。 如果沒有副本,更改子字符串中的字符會改變String
,這是不允許的。
StringBuilder的子字符串實際上將字符從起始索引復制到結束索引,因此它嘗試對子字符串長度的字符進行數組復制(即end index-startindex)。 這將是此操作的時間復雜度O(substringlength),因為循環從起始索引到結束索引,這是無法避免的。 使用子字符串char [],將實例化字符串對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.