初始化String对象时,至少有两种方法,例如:
String s = "some string";
String s = new String("some string");
有什么区别?
答案 0 :(得分:8)
Java语言对字符串有特殊处理;字符串文字自动成为String
对象。
因此,在第一种情况下,您正在将引用s
初始化为该String
对象。
在第二种情况下,您正在创建一个新的String
对象,将对原始String
对象的引用作为构造函数参数传递。换句话说,您正在创建副本。然后初始化引用s
以引用该副本。
答案 1 :(得分:7)
在第一种情况下,如果存在,则可以从池中获取此字符串。 在第二种情况下,您显式创建新的字符串对象。
您可以通过以下几行检查:
String s1 = "blahblah";
String s2 = "blahblah";
String s3 = new String("blahblah");
String s4 = s3.intern();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s3);
System.out.println(s1 == s4);
Output:
true
false
false
true
答案 2 :(得分:1)
String s =“some string”;将该值从字符串池(perm.gen.space)分配给s(如果它不存在则创建一个)
String s = new String(“some string”);创建一个新的字符串,其值在构造函数中给出,在堆中分配的内存
建议使用第一种方法,因为它有助于重用字符串池中的文字
答案 3 :(得分:0)
从语义上讲,第一个将"some string"
分配给s
,而第二个分配"some string"
到s
的副本(因为"some string"
已经是String
{{1}})。我认为在99.9%的情况下没有实际的理由这样做,因此我想说在大多数情况下,这两行之间的唯一区别是: