使用文字初始化类对象

时间:2013-07-16 13:25:23

标签: java string initialization

如果我写这段代码:

String s = new String("TestString");

我理解s是指动态创建的字符串。 s本身不是一个对象,而是指一个对象。

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

String s = "TestString";

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

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


Java级别:初学者

4 个答案:

答案 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)

来自Oracle Documentation

  

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

     

String greeting =“Hello world!”;

     

在这种情况下,“Hello world!”是一个字符串文字 - 一系列的   代码中的字符用双引号括起来。无论什么时候   遇到代码中的字符串文字,编译器会创建一个   String对象及其值 - 在本例中为Hello world!。

     

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

答案 3 :(得分:0)

  

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

不,这是特例,在字符串文字的情况下,String s = "someString"语句意味着我们指的是存储在字符串常量池中的someStringsomeString将是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。这种初始化是否允许用户创建的类为   好吗?

不,我们不能。