[英]String concatenation operator
有人把代碼和它的輸出正確嗎?
public class HelloWorld {
public static void main(String[] args) {
String s1 = "Hello World";
String s6 = "Hello" + " World";
String s7 = "Hello";
String s8 = " World";
String s9 = s7 + s8;
String s10 = s7 + " World";
System.out.println(s1==s6);
System.out.println(s1==s9);
System.out.println(s1==s10);
System.out.println(s9==s10);
}
}
輸出:
true
false
false
false
我知道s1
是在字符串常量池中創建的。 我想知道如何通過使用串聯運算符來創建s6
, s9
和s10
。
在編譯時做了很多優化。 因此,如果在編譯后查看反編譯的代碼,您將看到:
String s1 = "Hello World";
String s6 = "Hello World";
String s7 = "Hello";
String s8 = " World";
String s9 = (new StringBuilder(String.valueOf(s7))).append(s8).toString();
String s10 = (new StringBuilder(String.valueOf(s7))).append(" World").toString();
System.out.println(s1 == s6);
System.out.println(s1 == s9);
System.out.println(s1 == s10);
System.out.println(s9 == s10);
而且它很容易解釋。 因此,它是幕后的編譯器,他正在為您做大量工作。
當我們連接字符串文字時,它將用單個文字替換它;當我們使用變量進行串聯時,它將使用StringBuilder。
編譯器對此進行了優化:
String s6 = "Hello" + " World";
對此:
String s6 = "Hello World";
因此s1
和s6
指的是同一對象。 您可能希望編譯器對其他字符串進行類似的編譯時優化。 如果將s7
和s8
聲明為final
,它將:
public class HelloWorld {
public static void main(String[] args) {
String s1 = "Hello World";
String s6 = "Hello" + " World";
final String s7 = "Hello";
final String s8 = " World";
String s9 = s7 + s8;
String s10 = s7 + " World";
System.out.println(s1==s6);
System.out.println(s1==s9);
System.out.println(s1==s10);
System.out.println(s9==s10);
}
}
產生:
true true true true
歸結為編譯器願意連接編譯時常量。 在聲明s9
和s10
的行之前,它不會執行靜態代碼分析來確定s7
和s8
不會更改。 將它們聲明為final
將為您提供靜態代碼分析理論上可以提供的信息。
不能使用==
運算符來比較字符串, 而只能使用compareTo()
(或compareToIgnoreCase()
)方法進行比較。
...
String str01 = "abc";
...
System.out.println(str01.compareTo("abc") == 0); // Will print 'true'
System.out.println(str01.compareTo("a" + "b" + "c") == 0); // Will also print 'true'
System.out.println(str01.compareTo("ABC") == 0); // Will print 'false'
如果字符串相等,“ compareTo()”將返回一個整數,該整數將為零;在任何其他情況下,該整數將返回一個不同於零的數字。 檢查: http : //docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)
他們都在說“你好世界”
s6 =要組合的兩個字符串“ Hello”和“ World”。
串聯的用途是使用Java編程語言將字符串添加在一起。 這樣一來,您可以有多行,並且可以在多行中移動文本。
例如:
System.out.println("I enjoy" + "This nice " + "weather!");
會產生“我喜歡這個天氣!
之所以沒有空格,是因為它串聯時不執行任何操作,而是忽略“ +”號,然后將“”放在一起組成一個大句子或String。
對於s6,是說要添加兩個字符串“ Hello”和“ World”,這意味着最后將以“ Hello World”結尾。
對於s9,它使用String var s7和s8並將它們串聯在一起。 因此,當運行時,java會讀取s7並說“好吧,s7持有字符串“ Hello”,而s8持有字符串“ World”,我將它們放在一起創建“ Hello World”。
對於s10來說只是同一件事。 它使用s7 String並添加到它的末尾“ World”。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.