这两个陈述有什么区别?
String str = "stackoverflow";
&安培;
String str = new String("stackoverflow");
答案 0 :(得分:4)
字符串从池中获取的方式不同。
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
答案 1 :(得分:2)
构造函数public String(String arg)
的Javadoc说:
初始化一个新创建的String对象,使其表示与参数相同的字符序列;换句话说, 新创建的字符串是参数字符串的副本。除非 需要显式的原始副本,使用这个构造函数是 因为字符串是不可变的,所以不必要。
当你这样做的时候
String str = "stackoverflow"
编译器从文字中为您创建String对象。
当你这样做时:
new String("stackoverflow");
创建了两个,一个由编译器创建,另一个由您创建。
答案 2 :(得分:2)
Java有一个字符串池。更多信息:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
答案 3 :(得分:2)
第一行为stackoverflow字符串分配内存。然后它将变量指向此位置。
第二行为字符串分配空间。然后它创建一个新的String类。它将字符串从第一个位置复制到内存中的新位置。最后,它将变量指向该位置。
您在第二个示例中所做的只是为计算机创建更多工作并耗尽更多内存。