字符串连接运算符

bha*_*avs 1 java string

有人在代码及其输出上投掷吗?

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
false
false
Run Code Online (Sandbox Code Playgroud)

据我所知,这s1是在字符串常量池中创建的.我想知道如何创建s6,s9s10由于使用串联运算符.

vis*_*aim 5

在编译时完成了很多优化.因此,如果您在编译后查看解编译的代码,您将看到:

    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);
Run Code Online (Sandbox Code Playgroud)

它很容易解释.所以它是幕后的编译器,为你做了很多工作.

当我们连接字符串文字时,它用一个文字替换它,当我们使用连接变量时,它使用StringBuilder.