2013-07-16 54 views
2

類對象。如果我寫這樣的代碼:初始化使用文字

String s = new String("TestString"); 

我知道S如何是指動態創建的字符串。 s本身不是一個對象,而是指一個對象。

但我無法弄清楚這是什麼意思:

String s = "TestString"; 

Q1。如果它會是我能理解的一些原始數據類型,但這對於類類型意味着什麼? Q2302。這種類型的初始化是否也允許用戶創建類?


Java級別:初級

+0

這已經在這裏很深入地回答了:http://stackoverflow.com/a/3297877/1686330 –

回答

4

Q1。如果它會是我能理解的一些原始數據類型,但這對於類類型意味着什麼?

在這種情況下,"TestString"是一個字符串文字。字符串文字作爲參考String的實例。這是按照語言規範,§3.10.5。因此,在您的特定情況下,"TestString"是對String實例的引用,並且您將同一個引用分配給您的變量s

現在,有一些關於String的比較特殊的東西是由文字引用的。具有相同值的兩個字符串文字(邏輯上與字符串一樣)始終指示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

只是爲了澄清,字符串文字被添加到字符串常量池中。這意味着使用字面雙引號語法多次創建的相同字符串將引用同一個實例。在代碼中,這意味着''test「==」test「',但是'new String(」test「)!= new String(」test「)' –

+0

字符串常量池通常被稱爲字符串intern池。 –

0
String s = "TestString"; 

是創建一個字符串的正常方式。事實上,當你這樣做:

String s = new String("TestString"); 

你在做什麼,首先創建一個字符串,然後將它作爲參數傳遞給新的String();所以這個問題不是爲什麼第一個存在,但爲什麼第二個存在。答案是非常微妙的,你可能永遠不會在意:第一種方式創建一個字符串文字,不會收集垃圾,並在所有虛擬機上共享。第二個,而是,確實如此。這意味着,出於性能方面的原因,有時會想要使用第二種形式,例如處理非常大的字符串時。

你可以閱讀更多關於它在這裏:

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

0

Oracle Documentation

最直接的方法來創建一個字符串是寫:

字符串問候= 「你好,世界!」;

在這種情況下,「Hello world!」是一個字符串文字 - 用雙引號括起來的代碼中的一系列 字符。只要它在您的代碼中遇到字符串文字 ,編譯器就會創建一個帶有值的字符串對象 ,在這種情況下爲Hello world !.

與任何其他對象一樣,您可以使用 新關鍵字和構造函數創建String對象。

0

Q1。如果它會是一些原始數據類型,我會理解, 但這對於類類型意味着什麼?

不,這是特殊情況,在字符串的情況下,String s = "someString"表態意味着我們指的是someString存儲在字符串常量池中。 someString將是String類的一個實例,但將存儲在字符串文字池中。

關於字符串文字池的特別之處在於。

String s =「someString」; String 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一個很好的教程。這種類型的初始化是否允許用戶創建的類爲 ?

不,我們不能。