如果我写这段代码:
String s = new String("TestString");
我了解 s 如何引用动态创建的字符串。s 本身不是一个对象,而是指一个对象。
但我无法弄清楚这意味着什么:
String s = "TestString";
Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?
Q2。用户创建的类也允许这种初始化吗?
Java级别:初学者
如果我写这段代码:
String s = new String("TestString");
我了解 s 如何引用动态创建的字符串。s 本身不是一个对象,而是指一个对象。
但我无法弄清楚这意味着什么:
String s = "TestString";
Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?
Q2。用户创建的类也允许这种初始化吗?
Java级别:初学者
Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?
在这种情况下,"TestString"
是一个字符串文字。字符串文字还用作对String
. 这是根据语言规范§3.10.5。因此,在您的特定情况下"TestString"
是对 的实例的引用String
,并且您正在将相同的引用分配给您的变量s
。
现在,有一些关于String
s 的相当特殊的东西被字面量引用。具有相同值的两个字符串文字(逻辑上,作为字符串)总是引用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。用户创建的类也允许这种初始化吗?
不。
String s = "TestString";
是创建字符串的正常方式。事实上,当你这样做时:
String s = new String("TestString");
您正在做的是首先创建一个字符串,然后将其作为参数传递给 new String(); 所以问题不是为什么第一个存在,而是第二个为什么存在。答案非常微妙,您可能永远不会关心:第一种方法创建一个不会被垃圾收集的字符串文字,并且在所有 VM 上共享。相反,第二个确实如此。这意味着,出于性能原因,在某些情况下您想要使用第二种形式,例如处理非常非常大的字符串时。
你可以在这里读更多关于它的内容:
http://kjetilod.blogspot.com.es/2008/09/string-constructor-considered-useless.html
创建字符串最直接的方法是编写:
字符串问候语=“你好世界!”;
在这种情况下,“Hello world!” 是一个字符串文字——代码中的一系列字符,用双引号括起来。每当它在您的代码中遇到字符串文字时,编译器都会创建一个带有其值的 String 对象——在本例中为 Hello world!。
与任何其他对象一样,您可以使用 new 关键字和构造函数来创建 String 对象。
Q1。如果它是一些我会理解的原始数据类型,但这对类类型意味着什么?
不,这是特殊情况,对于字符串字面量,String s = "someString"
语句意味着我们所指someString
的存储在字符串常量池中。someString
将是String
类的一个实例,但将存储在字符串文字池中。
字符串字面量池的特殊之处在于。
字符串 s = "someString"; 字符串 s1 = "someString";
在这里,s == s1' will return
true` 因为它们将引用字符串字面量池中的同一个对象。
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。用户创建的类也允许这种初始化吗?
不,我们不能。