2

如果我写这段代码:

String s = new String("TestString");

我了解 s 如何引用动态创建的字符串。s 本身不是一个对象,而是指一个对象。

但我无法弄清楚这意味着什么:

String s = "TestString";

Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?

Q2。用户创建的类也允许这种初始化吗?


Java级别:初学者

4

4 回答 4

4

Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?

在这种情况下,"TestString"是一个字符串文字。字符串文字用作对String. 这是根据语言规范§3.10.5。因此,在您的特定情况下"TestString"是对 的实例的引用String,并且您正在将相同的引用分配给您的变量s

现在,有一些关于Strings 的相当特殊的东西被字面量引用。具有相同值的两个字符串文字(逻辑上,作为字符串)总是引用String. 这是由于字符串文字的“实习”。

然而,当你说

String s = new String("TestString");

仍然是"TestString"引用 的实例的情况String,实际上是字符串实习池中的一个实例,但引用同一个字符串的情况并非如此。s相反,s被初始化为其值等于"TestString",但它实际上是一个新的引用。那是:

String s = new String("TestString");
String t = "TestString";
System.out.println(s == t);

这将打印false.

Q2。用户创建的类也允许这种初始化吗?

不。

于 2013-07-16T13:32:24.923 回答
0
String s = "TestString";

是创建字符串的正常方式。事实上,当你这样做时:

String s = new String("TestString");

您正在做的是首先创建一个字符串,然后将其作为参数传递给 new String(); 所以问题不是为什么第一个存在,而是第二个为什么存在。答案非常微妙,您可能永远不会关心:第一种方法创建一个不会被垃圾收集的字符串文字,并且在所有 VM 上共享。相反,第二个确实如此。这意味着,出于性能原因,在某些情况下您想要使用第二种形式,例如处理非常非常大的字符串时。

你可以在这里读更多关于它的内容:

http://kjetilod.blogspot.com.es/2008/09/string-constructor-considered-useless.html

于 2013-07-16T13:33:29.647 回答
0

Oracle 文档

创建字符串最直接的方法是编写:

字符串问候语=“你好世界!”;

在这种情况下,“Hello world!” 是一个字符串文字——代码中的一系列字符,用双引号括起来。每当它在您的代码中遇到字符串文字时,编译器都会创建一个带有其值的 String 对象——在本例中为 Hello world!。

与任何其他对象一样,您可以使用 new 关键字和构造函数来创建 String 对象。

于 2013-07-16T13:33:46.017 回答
0

Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?

不,这是特殊情况,对于字符串字面量,String s = "someString"语句意味着我们所指someString的存储在字符串常量池中。someString将是String类的一个实例,但将存储在字符串文字池中。

字符串字面量池的特殊之处在于。

字符串 s = "someString"; 字符串 s1 = "someString";

在这里,s == s1' will returntrue` 因为它们将引用字符串字面量池中的同一个对象。

String s2 = new String("someString"); String s3 = new String("someString");

在这里,s2 == s3将返回false,因为两个字符串都将在非常量池内存中创建。

你可以在这里找到一个关于字符串的好教程

http://www.thejavageek.com/2013/06/19/the-string-constant-pool/ http://www.thejavageek.com/2013/06/17/string-immutability-in-java/

Q2。用户创建的类也允许这种初始化吗?

不,我们不能。

于 2013-07-16T13:34:00.670 回答