我試圖連接兩個字串,一個字串帶有一些值,另一個帶有空值。
例子:
String string1="Great"
String string2="";
并使用 concat 函式和 運算子連接這兩個字串
例子:
String cat=string1.concat(string2)
String operator=string1 string2
根據我的理解,在 concat 函式中使用空字串時,因為 string2 為空,不會創建新的參考。但是在使用 運算子時,將在字串池常量中創建一個新參考。但是在下面的代碼中,在使用 運算子時沒有創建新參考。
public class Main {
public static void main(String[] args) {
String string1="Great",string2="";
String cat=string1.concat(string2);
if(string1==cat)
{
System.out.println("Same");
}
else
{
System.out.println("Not same");
}
String operator=string1 string2;
if(operator==string1)
System.out.println("Same");
else
System.out.println("Not same");
}
}
輸出:
字串 1:69066349
貓:69066349
相同的
字串1:69066349
接線員:69066349
不一樣
從上面的代碼來看,因為它使用了 運算子,所以變數 : 運算子的參考應該指向新的記憶體,但它指向的是 string1 參考。請解釋上面的代碼。
uj5u.com熱心網友回復:
這一切都在檔案中。
對于String.concat,javadoc指出:
如果引數字串的長度為 0,則
String回傳此物件。
對于 運營商,JLS 15.8.1規定:
字串連接的結果是對一個
String物件的參考,該物件是兩個運算元字串的連接。在新創建的字串中,左側運算元的字符位于右側運算元的字符之前。該
String物件是新創建的(第12.5 節),除非運算式是一個常量運算式(第15.29 節)。
如您所見,對于第二個字串的長度為零且這不是常量運算式的情況,結果將有所不同。
這就是您的示例中發生的情況。
你還說:
但是在使用
運算子時,將在字串池常量中創建一個新參考。
這與您的問題沒有直接關系,但是......實際上,不會在那里創建它。它將String在堆中創建對常規(非實習)物件的參考。(它只會在類檔案的常量池中......因此字串池......如果它是一個常量運算式;參見JLS 15.29)
請注意,字串池和類檔案常量池是不同的東西。
我可以添加一些東西:
您可能不應該使用
String.concat. 該操作更簡潔,并JIT編譯器應該知道如何優化掉不必要的中間串的創作......在那里你可以考慮使用少數情況下concat出于性能的考慮。利用沒有創建新物件的事實是一個壞主意,因此您可以使用
==而不是equals(Object). 您的代碼將是脆弱的。只需將equalsalways 用于比較String和原始包裝型別。它更簡單、更安全。
簡而言之,您甚至提出這個問題的事實表明您正在走上死胡同。這種邊緣情況差的知識之間concat,并 是毫無意義的... ...除非你打算進入一個智力競賽節目的Java愛好者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/393400.html
