Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于字符串实例化的最佳实践_Java_String_Instantiation - Fatal编程技术网

Java 关于字符串实例化的最佳实践

Java 关于字符串实例化的最佳实践,java,string,instantiation,Java,String,Instantiation,我在读一些关于java最佳实践的建议,我得到了以下想法,这让我很好奇 此外,无论何时您想要实例化一个字符串对象,都不要使用它的构造函数,而是总是直接实例化它 例如: //slow instantiation String slow = new String("Yet another string object"); //fast instantiation String fast = "Yet another string object"; 为什么会这样?“fast”不是调用默认字符串构造函

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

此外,无论何时您想要实例化一个字符串对象,都不要使用它的构造函数,而是总是直接实例化它

例如:

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

//fast instantiation
String fast = "Yet another string object";

为什么会这样?“fast”不是调用默认字符串构造函数吗?

当您使用
new
时,您会得到一个新的字符串对象,但如果您使用字符串文本,则:

在计算机科学中,字符串插入是一种只存储一个字符串的方法 每个不同字符串值的副本,该值必须是不可变的。实习 字符串使某些字符串处理任务花费更多的时间,或者 节省空间,但在使用字符串时需要更多时间 创建或实习。不同的值存储在字符串intern中 水塘每个字符串的单个副本称为其“intern”,并且 例如,通常由string类的方法查找 Java中的String.intern()。Java中的所有编译时常量字符串都是 使用此方法自动实习

如果您这样做:

String a = "foo";
String b = "foo";
那么
a==b
是真的

仅当字符串未被暂存时,才会创建该字符串。 第一次将创建一个对象,并将其存储在名为字符串常量池的位置

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

现在
a==b
为false


因此,当使用literal时,它更容易阅读,而且编译器更容易进行优化。所以尽可能地使用它

JVM维护一个
String
文本池以进行优化。使用构造函数创建
字符串时

String s1 = new String("foo");
创建一个新的
String
对象,并将文本
“foo”
添加到池中。在此之后,无论何时在代码中使用
“foo”
,池中的
“foo”
都会引用该项,并且不会创建新对象。由于
String
是不可变的,因此不会产生任何问题

因此,当您使用“快捷方式”创建
字符串时:

JVM查看池,如果池中已经存在
“foo”
,它将使
s2
引用池中的项

这是与可能的性能影响的一个主要区别:构造函数总是创建一个对象,如果池中还没有文本,则将其添加到池中。快捷方式引用池中的项目,并且仅当Liutral不在池中时才创建新对象。

第二种或“快速”方法仅创建
字符串,如果该字符串尚未被Internetd,请查看以下内容:
String s1 = new String("foo");
String s2 = "foo"