Java 关于字符串实例化的最佳实践
我在读一些关于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”不是调用默认字符串构造函
//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"