This question already has answers here:
java string concatenation and interning
(3个答案)
去年关闭。
我正在查看有关Udemy的在线课程,该课程的讲师为String Interning提供了以下示例。
范例1:
范例2:
上面两个代码段之间有什么区别?为什么一个人被拘留而另一个人没有被拘留?
根据讲师的解释,在第一个示例中,
第二个示例尚未完全优化,使用
(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