String x = new String("xyz");
String y = "abc";
x = x + y;
在此代码中会创建多少String
个对象?
答案 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(),因此在此创建另一个对象。