自Java 7开始,String子字符串方法已将其大的O从O(1)更改为O(n)。
StringBuilder subSequence方法的时间复杂度是多少?
答案 0 :(得分:1)
在java-11-openjdk
中,AbstractStringBuilder.subSequence
呼叫substring
...
public CharSequence subSequence(int start, int end) {
return substring(start, end);
}
...几乎与具有相同名称的String
的方法完全相同...
public String substring(int start, int end) {
checkRangeSIOOBE(start, end, count);
if (isLatin1()) {
return StringLatin1.newString(value, start, end - start);
}
return StringUTF16.newString(value, start, end - start);
}
...调用newString
,这将(在两种情况下)都复制后备数组,所以它也是O(n)。
public static String newString(byte[] val, int index, int len) {
return new String(Arrays.copyOfRange(val, index, index + len),
LATIN1);
}
答案 1 :(得分:0)
我不知道您在哪里找到此信息。从O(1)到O(n)作为子字符串?
StringBuilder.subSequence(int start, int end)
的复杂度与String.substring(int start, int end)
的大致相同。
StringBuilder.subSequence(int, int)
实际上会调用AbstractStringBuilder.substring(int, int)
并调用public String(char value[], int offset, int count)
来创建结果。
String.substring(int start, int end)
使用相同的构造函数。
所以所有方法都具有相同的实现。
工作在字符串构造器中完成。它使用System.arrayCopy
将字符从一个缓冲区复制到另一个缓冲区。因此,它不会为每个单个字符进行赋值(这将使其变为O(n),其中n不是输入的长度,而是子字符串的长度),而是使用高性能的系统函数复制一个内存块,比O(n)好得多。