String x = new String("xyz");
String y = "abc";
x = x + y;
String
在这段代码中会创建多少个对象?
至少有四个对象:
"xyz"
"xyz"
实习字符串的副本"abc"
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();
加载类时,会创建两个 String 对象(很可能),每个 String 字面量一个。这是一次性的事情...
每次运行代码时,都会创建两个字符串:
创建一个新的new String("xyz")
字符串,其状态与"xyz"
文字相同。
字符串连接x + y
创建第二个新字符串。
应该注意的是,String y = "abc";
不会创建新的字符串。相反,它将对现有 String 的引用分配给y
. 实际上,它是在加载类时创建的字面量对 String 对象的引用。
实际上,如果您向下钻取,将为char[]
创建的每个 String 对象创建一个数组。并且字符串连接可能涉及临时StringBuilder
对象的创建。这两个都是实现细节。
加载类也可能不会导致创建新的 String 对象。确实,字符串字面量将由字符串池中的字符串对象表示,但是如何发生的确切过程是一个实现细节……而且它不一定需要调用String.intern
新创建的字符串对象。
另一个答案是创建了零个对象。那只是 Java 源代码,Java 源代码不会创建对象,除非您编译并运行它。(多田!!)
x :当您使用 String 类的 new 关键字和构造函数时,会创建一个 String 对象
"abc": 是一个字符串字面量,Java 在遇到字符串字面量时创建一个 String 对象。
x : 两个字符串的串联转化为StringBuilder.append(X).append(Y).toString(),所以这里又创建了一个对象。