字符串对象和字符串字面值的区别

259

什么是两者之间的区别?

String str = new String("abc");
并且
String str = "abc";

3
简洁回答:字符串对象是变量;字符串字面值是常量(在引号之间的固定字符序列)。[更多细节] (http://mindbugzz.blogspot.co.uk/2012/05/what-is-difference-between-strings-and.html) - Assad Ebrahim
一个字符串字面值是一个字符串对象,但一个字符串对象不一定是一个字符串字面值。一旦分配给一个引用变量,几乎不可能确定一个给定的字符串对象是否是一个字面值 - Hot Licks
这被标记为一个并不重复的东西的副本。虽然这并不是一个很好的问题,但其他人已经正确地将它列为副本,而副本列表应该以真正重复的东西结尾。 - Don Roby
我在 Sybex 考试中因为回答错误这个问题而失分:所有字符串字面量都会自动实例化为一个字符串对象。。考试似乎认为这总是正确的,即使字面量被内部化到已经存在的对象中? - djangofan
13个回答

2
以下是一些比较:
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()时,引用会发生更改。

1

String对象和字符串字面值之间存在微妙的差异。

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”将被放置在池中。

0

String s = new String("FFFF") 创建了两个对象:"FFFF" 字符串和指向 "FFFF" 字符串的 String 对象,所以它就像指针对指针(引用对引用,我对术语不太熟悉)。

据说您不应该使用 new String("FFFF")


不是真的。FFFF已经由编译器创建了。在运行时,将创建零个或一个对象。 - user207421
错误,有一个对象和一个引用变量。 - anshulkatta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接