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

RTA*_*RTA 5 java string

String x = new String("xyz");
String y = "abc"; 
x = x + y; 
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 12

将至少有四个对象:

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


Joh*_*ica 7

String x = new String("xyz");
Run Code Online (Sandbox Code Playgroud)

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

String y = "abc"; 
Run Code Online (Sandbox Code Playgroud)

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

x = x + y;
Run Code Online (Sandbox Code Playgroud)

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

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

StringBuilder s = new StringBuilder(x);
s.append(y);
x = s.toString();
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 6

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

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

  • new String("xyz")创建一个新的字符串,它的状态是一样的"xyz"文字.

  • String连接x + y创建第二个新String.

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


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

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


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