簡體   English   中英

字符串串聯運算符

[英]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是在字符串常量池中創建的。 我想知道如何通過使用串聯運算符來創建s6s9s10

在編譯時做了很多優化。 因此,如果在編譯后查看反編譯的代碼,您將看到:

    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";

因此s1s6指的是同一對象。 您可能希望編譯器對其他字符串進行類似的編譯時優化。 如果將s7s8聲明為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

歸結為編譯器願意連接編譯時常量。 在聲明s9s10的行之前,它不會執行靜態代碼分析來確定s7s8不會更改。 將它們聲明為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.

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