簡體   English   中英

關於Java中靜態字符串與看似本地字符串的壽命

[英]On the longevity of static strings vs seemingly local strings in Java

給出以下代碼段A

private static final String SQL = "SELECT * FROM TABLE WHERE ID = ?";

和片段B

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query("SELECT * FROM TABLE WHERE ID = ?",id);
}

和摘要C

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query(SQL,id);
}

B和C有效地相同嗎? 我在B中的字符串是否具有gc'd(年輕的一代?),因為它具有局部范圍?

字符串常量總是被interned 每次調用代碼段B時,它將使用相同的字符串對象。 基本上,這相當於代碼段A + C。

實際上,具有相同字符序列的兩個字符串常量也將使用對同一字符串的引用:

String x = "a" + "b";
String y = "ab";

System.out.println(x == y); // true

不,B和C都不會創建String 加載代碼時將創建String (如果它尚不存在作為內部String )。 它將與其余代碼一起被垃圾回收(除非有另一個對同一String實例的引用)。

B和C都使用相同的字符串值,因為所有字符串實際上都是由JVM“緩存”的。 只要需要,它們就存在於內存中。

是否使用B或C是代碼可讀性(和可維護性)的問題。 方法B的優勢在於,SQL查詢字符串緊鄰使用其結果的代碼,因此,在使用查詢時應該毫無疑問。

如果您在許多地方使用相同的SQL查詢字符串,則方法C很有用,它允許您為整個類(甚至包)定義一次字符串。 如果必須在使用它的任何地方進行更改,則只需更改一個定義。

暫無
暫無

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

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