两者有什么区别
String str = new String("abc");
and
String str = "abc";
两者有什么区别
String str = new String("abc");
and
String str = "abc";
当前回答
长一点的答案在这里,所以我给你一个短一点的。
当你这样做的时候:
String str = "abc";
你在String上调用intern()方法。该方法引用String对象的内部池。如果调用intern()的String已经在池中,则将该String的引用赋值给str。如果没有,则将新String放入池中,并将其引用赋值给str。
给定以下代码:
String str = "abc";
String str2 = "abc";
boolean identity = str == str2;
当你通过==来检查对象的同一性(你实际上是在问:这两个引用是否指向同一个对象?),你得到true。
但是,您不需要使用intern()字符串。你可以这样强制创建一个堆上的新对象:
String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;
在本例中,str和str2是对不同对象的引用,它们都没有被合并,因此当您使用==测试对象标识时,将得到false。
在良好的编码实践方面:不要使用==来检查String是否相等,而是使用.equals()来代替。
其他回答
以下是一些比较:
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的优秀文章。
根据String类文档,它们是等价的。
String(String original)的文档还说:除非需要original的显式副本,否则使用此构造函数是不必要的,因为String是不可变的。
寻找其他的回答,因为Java文档似乎是误导性的:(
字符串=新字符串(“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
一般来说,应该尽可能使用字符串文字表示法。它更容易阅读,并给编译器一个机会来优化你的代码。