根据time complexity or hidden cost of <Array Name>.length in java,它是一个O(1)操作数组来获取java中的长度。由于String是一个char数组,我认为它是相同的。
但是当我做一个简单的测试时:
public static void main(String args[]) {
String a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
for (int i = 0; i < 23; i++){
long start = System.nanoTime();
int l = a.length();
long end = System.nanoTime();
System.out.println("length: " + l + " cost: " + String.valueOf(end - start));
a = a + a;
}
}
得到
length: 100 cost: 395
length: 200 cost: 395
length: 400 cost: 395
length: 800 cost: 394
length: 1600 cost: 395
length: 3200 cost: 394
length: 6400 cost: 395
length: 12800 cost: 394
length: 25600 cost: 394
length: 51200 cost: 395
length: 102400 cost: 789
length: 204800 cost: 789
length: 409600 cost: 1974
length: 819200 cost: 790
length: 1638400 cost: 3158
length: 3276800 cost: 3553
length: 6553600 cost: 4342
length: 13107200 cost: 3552
length: 26214400 cost: 2368
length: 52428800 cost: 6711
length: 104857600 cost: 3158
length: 209715200 cost: 1974
当超过400000个字符时,运行成本似乎更长。
我是否错过或误解了什么?
答案 0 :(得分:1)
String.length()
确实是O(1)。如果您查看该类(从Java 1.6开始提供),它将返回字段。
public int length() {
return value.length;
}
所以我会说你的基准测试技术必须引入错误。