2 回答

TA貢獻1850條經驗 獲得超11個贊
if(String.valueOf('T').equalsIgnoreCase(bo.getSubjectType()))
像這樣寫它沒有任何好處。
String.valueOf('T')
將始終返回一個新字符串,等于"T"
,因為String.valueOf(char)
(或任何valueOf
重載,就此而言)的結果沒有被緩存。沒有理由一遍又一遍地創(chuàng)建相同的字符串。
另外,它更冗長。
只要堅持方法1。

TA貢獻1936條經驗 獲得超7個贊
方法 2 是難讀的,根本沒有任何改進。
String使用newoperator 運算符創(chuàng)建,它總是在堆內存中創(chuàng)建一個新對象。Stringcreated usingString literal可能會從 中返回一個現(xiàn)有對象String pool,如果它已經存在的話。
它不會String從池中返回 a 并創(chuàng)建一個Stringusingnew運算符(Oracle JDK 10 源代碼):
/**
* Returns the string representation of the {@code char}
* argument.
*
* @param c a {@code char}.
* @return a string of length {@code 1} containing
* as its single character the argument {@code c}.
*/
public static String valueOf(char c) {
if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {
return new String(StringLatin1.toBytes(c), LATIN1);
}
return new String(StringUTF16.toBytes(c), UTF16);
}
如果你想定義一個String常量并且總是從池中加載,只需創(chuàng)建一個:
public static final String T = "T";
關于JLS字符串文字和池:
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
和編譯單元:
package other;
public class Other {
public static String hello = "Hello";
}
產生輸出:
true true true true false true
這個例子說明了六點:
? 同一包 (§7 (Packages)) 中的同一類 (§8 (Classes)) 中的文字字符串表示對同一 String 對象 (§4.3.1) 的引用。
? 同一包中不同類中的文字字符串表示對同一字符串對象的引用。
? 不同包中不同類中的文字字符串同樣表示對同一字符串對象的引用。
? 由常量表達式(第 15.28 節(jié))計算的字符串在編譯時計算,然后將其視為文字。
? 在運行時通過連接計算的字符串是新創(chuàng)建的,因此是不同的。
? 顯式內嵌計算字符串的結果是與任何具有相同內容的預先存在的文字字符串相同的字符串。
添加回答
舉報