关于String实例化的最佳实践好奇心

Bog*_* M. 3 java string instantiation

我正在阅读有关java最佳实践的一些建议,我得到了以下想法让我很好奇

此外,无论何时想要实例化String对象,都不要使用其构造函数,而是始终直接实例化它.

例如:

//slow instantiation
String slow = new String("Yet another string object");

//fast instantiation
String fast = "Yet another string object";
Run Code Online (Sandbox Code Playgroud)

为什么是这样?不是'fast'调用默认的字符串构造函数?

Mar*_*oun 6

当你使用时,new你得到一个新的字符串对象,但是如果你使用字符串文字,那么请看这里:

在计算机科学中,字符串实习是一种只存储每个不同字符串值的一个副本的方法,该字符串值必须是不可变的.实习字符串使得一些字符串处理任务更加节省时间或空间,代价是在创建或实现字符串时需要更多时间.不同的值存储在字符串实习池中.每个字符串的单个副本称为"实习生",通常由字符串类的方法查找,例如Java中的String.intern().Java中的所有编译时常量字符串都使用此方法自动实现.

如果你这样做:

String a = "foo";
String b = "foo";
Run Code Online (Sandbox Code Playgroud)

a==b真的!

只有在尚未实现的情况下才会创建字符串.将在第一次创建对象,并将其存储在称为String常量池的位置.

但是使用new将为每个字符串创建不同对象,将输出false.

String a = new String("foo");
String b = new String("foo");
Run Code Online (Sandbox Code Playgroud)

现在a==b假的.

因此,在使用文字时,它更容易阅读,并且编译器更容易进行优化.所以..尽可能使用它.