java - 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
在运行时是已知的。这是为什么?
解决方案
您可以使用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
推荐阅读
- javascript - replace() 函数未按预期工作
- python-3.x - 通过 python sdk 创建 Azure VM 时出现错误“无法打印的云错误异常”
- node.js - 反向代理的 NodeJS 问题
- python - 如何使用 XPath 选择样式不包含 display: none 的元素并排除其子元素
- css - 新版 chrome 84.0.4147.105 的样式错误
- discord.js - Discord.js v12 出现反应消息问题
- typescript - VueJs - 无效的道具:道具“页面”的类型检查失败。预期 DocumentPageDto,得到对象
- java - Java11 迁移 - 编译错误,Symbol$ClassSymbol 无法转换为类 Symbol$MethodSymbol
- r - 有条件地替换组内的 nr
- python - 为什么覆盖 __lt__ 也会改变大于运算?为什么要用它来排序?