在我看来,它应该是恒定的(O(1))时间复杂度。但是我被告知在调用stringBuilder.substring()方法时必须实例化一个新的String对象。 (这不是静态方法)。如果这是真的,我如何在恒定的时间复杂度内获得子串?
答案 0 :(得分:2)
您不可能在String
的恒定时间内创建StringBuilder
并保持其不变性。此外,从Java 7 Update 25开始,即使String#substring()
也是线性时间,因为结构共享实际上造成了比它避免的更多麻烦:巨大字符串的子字符串保留了对巨大char
数组的引用。
答案 1 :(得分:1)
在我看来,它应该是恒定的(O(1))时间复杂度。
这是不可能的。由于Java字符串是不可变的,而StringBuilder
是可变的,因此产生String
的所有操作都必须复制。
如果这是真的,我怎样才能在恒定的时间复杂度内获得子串呢?
你做不到。如果没有副本,更改子字符串中的字符会改变String
,这是不允许的。
答案 2 :(得分:0)
StringBuilder的子字符串实际上将字符从开始索引复制到结束索引,因此它尝试对子字符串长度(即,结束索引-开始索引)的字符进行数组复制。这是该操作O(substringlength)的时间复杂度,因为循环是从开始索引到结束索引运行的,这是不可避免的。这样子字符串char [],字符串对象将被实例化。