2014-03-26 24 views
2

我有一個接受String參數的方法。我需要將我的String轉換爲char[]進行處理。但是,如果我的字符串大於某個長度,我可以停止處理我的方法邏輯。使用String.length()和string.toCharArray()進行速度/效率折衷。length

public void doSomething(String str) { 
    char[] strArray = str.toCharArray(); 
    // do something 
} 

我知道,在空間效率方面,我應該只是創建我char[]前檢查str.length()。然而,這讓我想到了。就時間複雜性而言,假設我需要char[],這更有效嗎?

假設我已經有兩個對象Stringchar[],哪個更快/更高效?

  1. str.length()

  2. strArray.length

+0

@yshavit你是對的。我錯了。 –

+0

@yshavit:所以他們停止在Java 8中共享char數組? –

+1

@AaronDigulla他們停止了這樣做。 –

回答

10

既然你已經兩個對象,時間複雜度是一樣的:它的O(1),因爲這兩個java.lang.String和Java數組存儲它們的長度直接檢索。

但是,您可以通過使用字符串getChars method以避免複製過去的字符串的結尾,你所需要的字符在你的方法的時機提高:

int maxLength = 100; 
int effectiveLength = Math.min(maxLength, str.length()); 
char[] strArray = new char[effectiveLength]; 
str.getChars(0, effectiveLength, strArray, 0); 

如果碰巧你的算法可以在到達字符串末尾之前停止處理,這種方法可以避免分配額外內存並將字符複製到內存中。

4

這取決於如何實現該方法,並且Java API不能保證。

當前的實現是toCharArray()會給你字符串的底層緩衝區的副本,所以這是一個非常昂貴的操作(內存分配+複製字節數),特別是相對於str.length()剛剛返回內部final字段的值(至少在Java 6中)。

在Java 7+中,他們似乎已經停止共享底層字符數組(現在,substr()總是複製)。

+1

OP明確表示他們已經調用'toCharArray()',並且只做一次;這似乎無關緊要。 –

+0

@LouisWasserman:Nope:「我應該在**創建我的char []之前檢查str.length()**。」 –

+0

@clcto:您的編輯錯誤。 'String.length()'不會**返回底層'char'數組的長度。 –