是O(n)还是O(1)(通过在对象的字符串分配期间保存私有变量的长度)。
如果是O(n),是否意味着下面代码的复杂性是O(n ^ 2)?
for(int i=0; i<s.length()-1;i++){
//some code here!
}
答案 0 :(得分:14)
O(1)
,String
实例已知长度。{/ p>
从JDK 1.6可见。
public int length() {
return count;
}
更新
了解为什么他们可以缓存count
的值并继续使用count
的相同值非常重要。原因在于他们在设计String
时所做的一个很好的决定,即它的不变性。
答案 1 :(得分:1)
在Java中,任何String都由final
数组备份。因此返回数组长度很简单。所以它是O(1)
复杂性。如果你在代码中思考
for(int i=0; i<s.length()-1;i++){
//some code here!
}
每次迭代都会调用 s.length()
,然后你就不对了。现代编译器优化了这种类型的调用,并将s.length()
更改为常数(即String
实例的长度)。
答案 2 :(得分:0)
复杂性为O(1)
,因为String
类的长度为field
。这不是O(n ^ 2)。
答案 3 :(得分:0)
String内部维护一个数组字符,数组的长度是数组对象的属性,因此O(1)是其简单的属性读取。