java - Java 中的字符串实习

标签 java string string-interning

我正在观看 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/

相关文章:

c - 如何将 char 数组转换为 C 中的字符串?

java - 为什么虎书的符号表中要字符串intern?

java - 为什么 str == str.intern() for StringBuilder using append or not different 的结果?

java - Spring security 只允许访问具有特定用户名的用户

java - 使用for循环获取2个字符串之间的汉明距离

java - 有没有一种有效的方法可以使重写方法的相关接口(interface)变得透明

c - 尝试创建子字符串时断言失败错误

c# - .NET 中的垃圾收集是否排除了驻留字符串?

java - 如何通过此 Activity 解决 : IllegalStateException: You need to use a Theme. AppCompat 主题(或后代)

java - 映射实体,列表作为映射值。通过 JDBC 语句执行 DDL "drop table if exists ` single_line`"时出错