两者有什么区别
String str = new String("abc");
and
String str = "abc";
两者有什么区别
String str = new String("abc");
and
String str = "abc";
当前回答
由于字符串是不可变的,当你这样做时:
String a = "xyz"
在创建字符串时,JVM在字符串池中搜索是否已经存在一个字符串值“xyz”,如果存在,'a'将只是该字符串的引用,并且不会创建新的string对象。
但如果你说:
String a = new String("xyz")
强制JVM创建一个新的String引用,即使"xyz"在它的池中。
要了解更多信息,请阅读这篇文章。
其他回答
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
字符串=新字符串(“FFFF”)创建2个对象:“FFFF”字符串和字符串对象,指向“FFFF”字符串,所以它就像指针指针(引用引用,我不热衷于术语)。
据说你永远不应该使用new String("FFFF")
字符串对象和字符串文字之间有细微的区别。
String s = "abc"; // creates one String object and one reference variable
在这个简单的例子中,“abc”将进入池,s将指向它。
String s = new String("abc"); // creates two objects,and one reference variable
在本例中,因为我们使用了new关键字,Java将创建一个新的String对象 在普通(非池)内存中,和s将指向它。此外,字面上的“abc”将 放在水池里。
除了已经发布的答案,还可以查看这篇关于javaranche的优秀文章。
以下是一些比较:
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()时,引用将被更改。