String s =“something”之间有什么区别;和String s = new String(“something”);

时间:2011-11-08 11:07:58

标签: java

  

可能重复:
  difference between string object and string literal

初始化String对象时,至少有两种方法,例如:

String s = "some string";
String s = new String("some string");

有什么区别?

4 个答案:

答案 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%的情况下没有实际的理由这样做,因此我想说在大多数情况下,这两行之间的唯一区别是:

  1. 第二行更长。
  2. 第二行可能比第一行占用更多内存。
  3. 正如@ Anish-Dasappan所提到的,第二个将在堆中具有它的值,而第一个将在字符串池中 - 我不确定这对程序员有什么兴趣,但我可能会错过一个聪明的伎俩。