两者有什么区别

String str = new String("abc");

and

String str = "abc";

当前回答

当你使用字符串字面值时,字符串可以被合并,但当你使用new string("…")时,你会得到一个新的字符串对象。

在这个例子中,两个字符串字面值引用同一个对象:

String a = "abc"; 
String b = "abc";
System.out.println(a == b);  // true

这里创建了2个不同的对象,它们有不同的引用:

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d);  // false

一般来说,应该尽可能使用字符串文字表示法。它更容易阅读,并给编译器一个机会来优化你的代码。

其他回答

字符串=新字符串(“FFFF”)创建2个对象:“FFFF”字符串和字符串对象,指向“FFFF”字符串,所以它就像指针指针(引用引用,我不热衷于术语)。

据说你永远不应该使用new String("FFFF")

当你使用字符串字面值时,字符串可以被合并,但当你使用new string("…")时,你会得到一个新的字符串对象。

在这个例子中,两个字符串字面值引用同一个对象:

String a = "abc"; 
String b = "abc";
System.out.println(a == b);  // true

这里创建了2个不同的对象,它们有不同的引用:

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d);  // false

一般来说,应该尽可能使用字符串文字表示法。它更容易阅读,并给编译器一个机会来优化你的代码。

以下是一些比较:

String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true

System.out.println(s1 == s3);   //false
System.out.println(s1.equals(s3)); //true

s3 = s3.intern();
System.out.println(s1 == s3); //true
System.out.println(s1.equals(s3)); //true

当调用intern()时,引用将被更改。

除了已经发布的答案,还可以查看这篇关于javaranche的优秀文章。

在第一种情况下,创建了两个对象。

在第二种情况下,它只是一个。

尽管两种方式str都指向abc。