为什么一个大字符串的长度似乎花费更多?什么是复杂性string.length?

时间:2017-06-05 11:44:08

标签: java

根据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个字符时,运行成本似乎更长。

我是否错过或误解了什么?

1 个答案:

答案 0 :(得分:1)

String.length()确实是O(1)。如果您查看该类(从Java 1.6开始提供),它将返回字段

public int length() {
    return value.length;
}

所以我会说你的基准测试技术必须引入错误。