簡體   English   中英

在Java中重復使用字符串中的字符的更好方法

[英]Better way to repeatedly use characters from a string in Java

我想多次使用字符串中的字符,並想知道是否每次需要字符時都使用string.charAt()更好,或者將char數組保存為string.toCharArray()並使用索引來訪問數組中的字符是否更好? 。 因此,我編寫了一個簡單的基准程序,並觀察到了明顯的性能差異。

static int[] loops = new int[]{10000, 100000, 1000000};

static void useCharAt(String s){
    int sum = 0;
    for(int loop : loops) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < loop; i++) {
            for (int j = 0; j < s.length(); j++) {
                sum += s.charAt(j);
            }
        }
        System.out.println("string size is " + s.length() + ", loop size is "+loop+", charAt() costs " + (System.currentTimeMillis() - start) + " ms");
    }
}

static void useArray(String s){
    char[] arr= s.toCharArray();
    int sum = 0;
    for(int loop : loops) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < loop; i++) {
            for (char c : arr) {
                sum += c;
            }
        }
        System.out.println("string size is " + s.length() + ", loop size is "+loop+", array costs " + (System.currentTimeMillis() - start) + " ms");
    }
}

public static void main(String[] args){
    StringBuilder sb = new StringBuilder();
    int strLen[] = new int[]{1000, 5000, 10000};
    for(int len : strLen) {
        sb.setLength(0);
        for(int i = 0; i < len; i++) sb.append('a');
        String s = sb.toString();
        useArray(s);
        useCharAt(s);
    }
}

結果是

string size is 1000, loop size is 10000, array costs 10 ms
string size is 1000, loop size is 100000, array costs 60 ms
string size is 1000, loop size is 1000000, array costs 495 ms
string size is 1000, loop size is 10000, charAt() costs 14 ms
string size is 1000, loop size is 100000, charAt() costs 184 ms
string size is 1000, loop size is 1000000, charAt() costs 1649 ms

string size is 5000, loop size is 10000, array costs 23 ms
string size is 5000, loop size is 100000, array costs 232 ms
string size is 5000, loop size is 1000000, array costs 2277 ms
string size is 5000, loop size is 10000, charAt() costs 82 ms
string size is 5000, loop size is 100000, charAt() costs 828 ms
string size is 5000, loop size is 1000000, charAt() costs 8202 ms

string size is 10000, loop size is 10000, array costs 44 ms
string size is 10000, loop size is 100000, array costs 458 ms
string size is 10000, loop size is 1000000, array costs 4559 ms
string size is 10000, loop size is 10000, charAt() costs 166 ms
string size is 10000, loop size is 100000, charAt() costs 1626 ms
string size is 10000, loop size is 1000000, charAt() costs 16280 ms

我不知道為什么charAt()比直接訪問數組要慢? 我檢查了chatAt()的實現,發現數組直接訪問方法沒有區別。

public char charAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}

使用toCharArray()會產生初始成本,在該成本下會復制String的內部數組。

從那時起,它是對數組的簡單訪問(在返回值時,charAt()中也會發生隱式邊界檢查)。 調用charAt()會帶來函數調用和重復的邊界檢查(拋出StringIndexOutOfBoundsException而不是ArrayIndexOutOfBoundsException)的代價。

這種效果是眾所周知的,並且在早期的Java Performance書籍中已經提到過。

簡而言之:如果只訪問String中的單個字符,最好使用charAt()。 如果您訪問更多或所有字符,並且String可能更長,那么最好使用toCharArray()並改為遍歷數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM