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