This question already has answers here:
java string concatenation and interning
                                
                                    (3个答案)
                                
                        
                去年关闭。
            
        

我正在查看有关Udemy的在线课程,该课程的讲师为String Interning提供了以下示例。

范例1:

String s1 = "hel" + "lo"; // This is interned by JVM


范例2:

String s1 = "lo";
String s2 = "hel" + s1 ; // This is not interned automatically by JVM


上面两个代码段之间有什么区别?为什么一个人被拘留而另一个人没有被拘留?

根据讲师的解释,在第一个示例中,s1的值在编译时是已知的,但是在第二个示例中,s2的值在运行时是已知的。这是为什么?

最佳答案

您可以使用javap -v <file>.class命令查看生成的字节码。

查看Java 11字节码,第一个示例由javac编译器优化:

Code:
  stack=1, locals=2, args_size=1
     0: ldc           #2                  // String hello
     2: astore_1
     3: return


第二个示例尚未完全优化,使用invokedynamic构造第二个字符串:

Code:
  stack=1, locals=3, args_size=1
     0: ldc           #2                  // String lo
     2: astore_1
     3: aload_1
     4: invokedynamic #3,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
     9: astore_2
    10: return

07-25 21:39