字符串对象和字符串文字之间的区别[重复]

问题

这个问题在这里已有答案:

  • "text"和new String("text")之间有什么区别? 9个答案

有什么区别

String str = new String("abc");

String str = "abc";

#1 热门回答(195 赞)

当你使用字符串文字时,字符串可以被中断,但是当你使用5772378877时,你得到一个新的字符串对象。

在此示例中,两个字符串文字都引用相同的对象:

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

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

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

通常,应尽可能使用字符串文字表示法。它更容易阅读,它使编译器有机会优化你的代码。


#2 热门回答(83 赞)

AString literal是一种Java语言概念。这是一个字符串文字:

"a String literal"

AString对象是java.lang.Stringclass的单​​个实例。

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

所有都有效,但有一点点差异.s1将引用aninternedString对象。这意味着,字符序列"abcde"将存储在中心位置,并且每当再次使用相同的literal"abcde"时,JVM将不会创建新的String对象,而是使用thecachedString的引用。

s2保证是一个新的String对象,所以在这种情况下我们有:

s1 == s2 // is false
s1 == s3 // is true
s1.equals(s2) // is true

#3 热门回答(36 赞)

很长的答案是here,所以我会给你一个简短的答案。

当你这样做:

String str = "abc";

你在电话号码886225113上打电话给String。此方法引用内部池String对象。如果你调用的字符串intern()已经驻留在池中,则对该String的引用分配给str。如果没有,则将newString放入池中,然后将对它的引用分配给str

给出以下代码:

String str = "abc";
String str2 = "abc";
boolean identity = str == str2;

当你通过doing==检查对象标识时(你真的要问:这两个引用是否指向同一个对象?),你得到了3646414773。

但是,你没有到过intern()``Strings。你可以通过执行以下操作在Heap上强制创建新的Object

String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;

在这种情况下,strstr2引用了不同的Objects,两者都没有被中断,因此当你使用==测试Object身份时,你将获得false

在良好的编码实践方面:donotuse==检查字符串是否相等,请使用.equals()