Java StringBuilder.substring()方法的时间复杂度是多少?如果它是线性的,是否有一个恒定的时间复杂度方法来获得子串?

时间:2014-08-26 19:48:40

标签: java string substring time-complexity stringbuilder

在我看来,它应该是恒定的(O(1))时间复杂度。但是我被告知在调用stringBuilder.substring()方法时必须实例化一个新的String对象。 (这不是静态方法)。如果这是真的,我如何在恒定的时间复杂度内获得子串?

3 个答案:

答案 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 [],字符串对象将被实例化。