首页 > 解决方案 > Java中的字符串实习

问题描述

我正在查看 Udemy 上的在线课程,其中讲师提供了以下字符串实习示例。

示例 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在运行时是已知的。这是为什么?

标签: javastringstring-interning

解决方案


您可以使用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

推荐阅读