这两种说法有什么区别?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
它与从池中获取字符串的方式不同。
1. 当你说,
String str = "stackoverflow"
它将首先检查"stackoverflow"
字符串池中是否已经存在。如果是这样,那么它将使用来自池的相同内容。
这就是为什么当,
String str1= "stackoverflow";
String str2 ="stackoverflow";
str1==str2? --> will be true
上面的结果将为真,因为使用了池中相同的 String 对象。
2. 当你这样做时,
String str = new String("stackoverflow");
总是会创建一个新的 String 对象,而不管池中是否已经存在相同的对象。
所以,
String str1= "stackoverflow";
String str2 =new String("stackoverflow");
String str3 =new String("stackoverflow");
在这里,str2 和 str3 将再次创建一个新的 String 对象。
因此,str2、str3 和 str1 都指代不同的对象,并且str2!=str3!=str1
构造函数的 Javadocpublic String(String arg)
说:
初始化一个新创建的 String 对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要原始的显式副本,否则不需要使用此构造函数,因为字符串是不可变的。
当您这样做时
String str = "stackoverflow"
,编译器会根据文字为您创建 String 对象。
当您这样做时:
new String("stackoverflow");
创建两个,一个由编译器创建,一个由您创建。
Java 有一个字符串池。更多信息:http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
第一行为 stackoverflow 字符串分配内存。然后它将变量指向该位置。
第二行为字符串分配空间。然后它创建一个新的 String 类。它将字符串从第一个位置复制到内存中的新位置。最后,它将变量指向该位置。
您在第二个示例中所做的只是为计算机创建更多工作并使用更多内存。