2016-07-18 86 views
0

learned字符串文字不總是垃圾回收,所以我不知道這兩個代碼示例是否比較性能的情況下?存儲字符串文字的長度是否會影響性能?

length()只是返回String的內部字符數組的大小,所以只要一個String不是新創建的,就不需要計算。

// example 1 
private static final int BAR_LENGTH = "bar".length(); 
public int foo() { 
    return BAR_LENGTH; 
} 

// example 2 
public int foo() { 
    return "bar".length(); 
} 
+0

也許我在這裏解釋代碼有點過於簡單,但是示例2在性能上明顯更差,因爲每次調用foo()時都會生成一個新的「String」欄。 – Zircon

+3

沒有區別。如果您檢查長度,則返回字符串所支持字符數組的長度屬性。 – SMA

+3

@Zircon - 每次都不會創建一個新的字符串。 JLS保證「bar」文字由唯一一個對象表示。 –

回答

3

字符串文字保存在字符串池中。因此,在上述兩種情況下,字符串將不會被重新創建,它將從池中獲取。因此在性能上沒有區別。

+0

這是否意味着只要程序結束,在可訪問方法中聲明的任何字符串都將保留在內存中? – Journeycorner

+1

是的。可訪問意味着該字符串是在編譯代碼中引用的。我知道字符串文字是GCed的唯一情況是該類被動態加載並且類加載器被銷燬 – yamenk

2

我不認爲這會有什麼區別。

這是length方法從String(Here's the JavaDoc)類的實現看起來像:

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

所以基本上,它會返回數組value(定義爲private final char[] value;)的長度牽着你的字符串中的字符。而length本身就是數組的一個屬性。

相關問題