两者有什么区别
String str = new String("abc");
and
String str = "abc";
两者有什么区别
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
一般来说,应该尽可能使用字符串文字表示法。它更容易阅读,并给编译器一个机会来优化你的代码。
其他回答
在第一种情况下,创建了两个对象。
在第二种情况下,它只是一个。
尽管两种方式str都指向abc。
除了已经发布的答案,还可以查看这篇关于javaranche的优秀文章。
String字面值是Java语言的一个概念。这是一个String字面值:
"a String literal"
String对象是java.lang.String类的一个单独实例。
String s1 = "abcde";
String s2 = new String("abcde");
String s3 = "abcde";
都是有效的,但有细微的区别。s1将引用一个被压缩的String对象。这意味着,字符序列“abcde”将存储在一个中心位置,无论何时再次使用相同的文字“abcde”,JVM都不会创建一个新的String对象,而是使用缓存的String的引用。
s2肯定是一个新的String对象,所以在这种情况下,我们有:
s1 == s2 // is false
s1 == s3 // is true
s1.equals(s2) // is true
由于字符串是不可变的,当你这样做时:
String a = "xyz"
在创建字符串时,JVM在字符串池中搜索是否已经存在一个字符串值“xyz”,如果存在,'a'将只是该字符串的引用,并且不会创建新的string对象。
但如果你说:
String a = new String("xyz")
强制JVM创建一个新的String引用,即使"xyz"在它的池中。
要了解更多信息,请阅读这篇文章。
当你使用字符串字面值时,字符串可以被合并,但当你使用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
一般来说,应该尽可能使用字符串文字表示法。它更容易阅读,并给编译器一个机会来优化你的代码。