这两条语句有什么区别?字符串原始类型/字符串类的区别?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
这两条语句有什么区别?字符串原始类型/字符串类的区别?
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
很好的分析/解释 –
为构造public String(String arg)
的Javadoc说:
初始化新创建的字符串对象,它表示字符作为参数相同的序列;换句话说, 新创建的字符串是参数字符串的副本。除非需要显式拷贝原始文件,否则由于字符串是不可变的,因此使用此构造函数是 。
当你 String str = "stackoverflow"
编译器为您从字面创建String对象。
当你这样做: new String("stackoverflow");
两个是由编译器和你一个创建的。
Java有一个字符串池。更多信息:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
+1。您分享的链接可以精确解释差异。 – verisimilitude
第一行为stackoverflow字符串分配内存。然后它将变量指向这个位置。
第二行为字符串分配空间。然后它创建一个新的String类。它将字符串从第一位复制到内存中的新位置。最后,它将变量指向该位置。
您在第二个示例中所做的就是为计算机创建更多工作,并占用更多内存。
>>>直到下一次垃圾回收:实际上,如果你在GC开始使用 –
时,文字将不会被GCed或'str'噢,让我解决它。 –
...因为他们(文学)实习生()编辑 –
可能重复http://stackoverflow.com/questions/3297867/difference-between-字符串对象和字符串文字) – EJP