字符串实例化与stringbuffer实例化

Ror*_*ach 3 java

我无法弄清楚是否

String ab = "hello";        //straight initialization

String ab_1 = new String ("hello_1");  //initializing using new
Run Code Online (Sandbox Code Playgroud)

两者都有效,但是

StringBuffer bfr = new StringBuffer("hi");   //works only with new
Run Code Online (Sandbox Code Playgroud)

只有在使用new创建时才有效.

为什么String可以直接实例化,但StringBuffer需要new运算符.有人可以解释我的主要原因.

ass*_*ias 6

所有对象都需要实例化new.只能从文字(int i = 0;)中实例化基元.

唯一的例外是:

  • 字符串,允许特殊的初始化结构:
   String s = "abc"; //can be instantiated from a literal, like primitives
Run Code Online (Sandbox Code Playgroud)
  • null实例化: Object o = null;

它在Java语言规范#3.10中定义:

文字是基本类型值,String类型或null类型的源代码表示.

注意:数组也有专门的初始化模式,但这不是文字:

   int[][] a = { { 00, 01 }, { 10, 11 } };
Run Code Online (Sandbox Code Playgroud)

  • 添加它,使用文字结构创建的字符串转到字符串池,可以重复使用.但是,使用new创建的字符串不会转到字符串池,StrinbBuffer对象也不会转到那里. (4认同)