我正在观看 Udemy 上的在线类(class),其中讲师提供了以下字符串实习示例。
示例 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
关于java - Java 中的字符串实习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54908888/