5
String x = new String("xyz");
String y = "abc"; 
x = x + y; 

String在这段代码中会创建多少个对象?

4

4 回答 4

12

至少有四个对象:

  • 实习字符串"xyz"
  • "xyz"实习字符串的副本
  • 实习字符串"abc"
  • 连接两个字符串的结果。
于 2013-04-01T12:42:34.100 回答
7
String x = new String("xyz");

有一个:"xyz"是一个实习字符串。
有两个:new String("xyz")

String y = "abc"; 

有三个:"abc"是一个实习字符串。

x = x + y;

有四个。由于字符串是不可变的,因此必须创建第三个字符串对象:new String("xyzabc").

可能有第五个对象,因为编译器可以使用 StringBuilder 来执行字符串连接。

StringBuilder s = new StringBuilder(x);
s.append(y);
x = s.toString();
于 2013-04-01T12:41:37.430 回答
6

加载类时,会创建两个 String 对象(很可能),每个 String 字面量一个。这是一次性的事情...

每次运行代码时,都会创建两个字符串:

  • 创建一个新的new String("xyz")字符串,其状态与"xyz"文字相同。

  • 字符串连接x + y创建第二个新字符串。

应该注意的是,String y = "abc";不会创建新的字符串。相反,它将对现有 String 的引用分配给y. 实际上,它是在加载类时创建的字面量对 String 对象的引用。


实际上,如果您向下钻取,将为char[]创建的每个 String 对象创建一个数组。并且字符串连接可能涉及临时StringBuilder对象的创建。这两个都是实现细节。

加载类也可能不会导致创建新的 String 对象。确实,字符串字面量将由字符串池中的字符串对象表示,但是如何发生的确切过程是一个实现细节……而且它不一定需要调用String.intern新创建的字符串对象。


另一个答案是创建了零个对象。那只是 Java 源代码,Java 源代码不会创建对象,除非您编译并运行它。(多田!!)

于 2013-04-01T12:44:03.523 回答
1

x :当您使用 String 类的 new 关键字和构造函数时,会创建一个 String 对象

"abc": 是一个字符串字面量,Java 在遇到字符串字面量时创建一个 String 对象。

x : 两个字符串的串联转化为StringBuilder.append(X).append(Y).toString(),所以这里又创建了一个对象。

于 2013-04-01T12:44:07.793 回答