这里会创建多少个String对象?

时间:2013-04-01 12:39:18

标签: java string

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

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

4 个答案:

答案 0 :(得分:12)

至少会有四个对象:

  • 实习字符串"xyz"
  • 实习"xyz"字符串
  • 的副本
  • 实习字符串"abc"
  • 连接两个字符串的结果。

答案 1 :(得分: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();

答案 2 :(得分:6)

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

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

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

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

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


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

加载类可能也可能不会导致新的String对象的创建。确实,字符串文字将由字符串池中的字符串对象表示,但是如何发生的确切过程是实现细节......并且必然需要调用{{ 1}}在新创建的String对象上。


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

答案 3 :(得分:1)

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

“abc”:是一个字符串文字,只要遇到字符串文字,Java就会创建一个String对象。

x:两个字符串的串联转换为StringBuilder.append(X).append(Y).toString(),因此在此创建另一个对象。