Java字符串常量池 - 创建的对象数

use*_*545 4 java string object

以下代码将创建多少个字符串对象?

String s = "Mahendra" + "Singh" + "Dhoni";
Run Code Online (Sandbox Code Playgroud)

它会在字符串池中创建4个字符串对象还是会创建更多?请详细解释.

PS我见过其他例子,他们只处理2个字符串对象.

编辑:我从答案中看到,在上面的情况下,只会创建一个对象.非常感谢一些非常好的建议.很抱歉问一个愚蠢的问题,但是你可以在下面的例子中说明将创建多少个对象?

String s = "Mahendra";
s = s + "Singh" + "Dhoni";
Run Code Online (Sandbox Code Playgroud)

第二次编辑:再次抱歉,但我还有一些疑问.我在评论中看到,在上面的例子中,将创建3个对象"Mahendra","SinghDhoni"和"MahendraSinghDhoni".我怀疑不应该从左到右计算.我错过了什么 - 概念明智吗?请帮忙.

另外,在另一种情况下,如果我扭曲这个问题,对象的数量将如何变化.我正在详细询问这一点,以便为很多同事清除它.所有的帮助表示赞赏.

String s = "Singh";
s = "Mahendra" + s + "Dhoni";
Run Code Online (Sandbox Code Playgroud)

The*_*ind 5

如果你的代码是:

public static void main(String[] args) {
    String s = "Mahendra" + "Singh" + "Dhoni";
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

看一下字节码:

 public static void main(java.lang.String[]);
   descriptor: ([Ljava/lang/String;)V
   flags: ACC_PUBLIC, ACC_STATIC
   Code:
     stack=2, locals=2, args_size=1
        0: ldc           #16                 // String MahendraSinghDhoni --> This line
        2: astore_1
        3: getstatic     #18                 // Field java/lang/System.out:Ljav
/io/PrintStream;
        6: aload_1
        7: invokevirtual #24                 // Method java/io/PrintStream.prin
ln:(Ljava/lang/String;)V
       10: return
Run Code Online (Sandbox Code Playgroud)

如您所见,编译器在编译期间添加了所有三个字符串.所以会有只有一个串字符串常量池中多数民众赞成.

编辑:根据编辑的问题:

"Singh" + "Dhoni"将在编译期间添加.所以总共会有3个String对象. "Mahendra"并将"SinghDhoni"String常量池上,然后 mahendraSinghDhoni将在堆上.