[英]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.