gpt4 book ai didi

java - 字符串概念的困惑

转载 作者:行者123 更新时间:2023-12-01 08:10:55 25 4
gpt4 key购买 nike

class StringTest1
{
public static final void main(String... a)
{
String str1="JAVA";
String str2="WORLD";

String str3=str1+str2;
}
}

这个过程中会创建多少个对象?我认为将创建 3 个对象。

class StringTest2
{
public static final void main(String... a)
{

String strTest="JAVA"+"WORLD";
}
}

这个过程中会创建多少个对象?有多少个对象是可访问的?有人告诉我“JAVA”+“WORLD”是一个表达式,它不会存储在字符串池中。

最佳答案

在第一个示例中,您最终将得到三个 String 对象。您实际上可以在字节码中看到这一点。

假设您有以下代码:

public class StrTest {
public static void main(String[] args) {
String str1 = "JAVA";
String str2 = "WORLD";

String str3 = str1 + str2;

String strTest = "JAVA" + "WORLD";
}
}

生成的字节码是:

public class StrTest {
public StrTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: ldc #2 // String JAVA
2: astore_1
3: ldc #3 // String WORLD
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: ldc #8 // String JAVAWORLD
27: astore 4
29: return
}

可以看到Java编译器在字符串池中为"JAVA""WORLD"创建了两个String实例。为了将这两个附加在一起,它创建了一个 StringBuilder 实例并附加了值。之后,它在该实例上调用 toString(),这将创建一个新的 String 实例,其中包含 "JAVAWORLD"

在第二种情况下,您最终只会得到一个 String 实例,因为 Java 编译器足够聪明,可以看到您基本上拥有的是一个常量,因此它会执行一些编译时优化通过评估该表达式并在包含“JAVAWORLD”的字符串池中创建一个 String 实例。然后将该实例的引用分配给 strTest

对于字符串 "JAVA""WORLD""JAVAWORLD",这些基本上都是内部字符串。由于字符串在 Java 中是不可变的,因此您只需要对一个唯一实例进行一次引用,该实例可以在代码中的多个位置重用。这基本上是一种节省内存的方法。

总结一下:

  • 情况 1:三个 String 实例:两个在池中,一个是附加后新建的(还创建了一个 StringBuilder 实例来附加这两个字符串,导致总共 4 个对象)。
  • 情况 2:池中的一个实例。

关于java - 字符串概念的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17393271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com