2014-05-07 108 views
3

第一代碼如下所示:String如何調用構造函數?

String s = "hello"; 

第二代碼如下所示:

String s = new String("hello"); 

問題:是兩個代碼調用的String(char[])相同構造?

String有一個private final field char value[]。爲什麼它設置爲final字段?我們每次調用字符串的值時都會創建一個新的String。將字段char value[]設置爲final的目的是什麼?

+0

'將字段char []設置爲final是什麼目的?' - 它使字符串不可變。 – Braj

+0

[字符串常量池](http://stackoverflow.com/questions/23505952/java-strings-immutability/23505989#23505989)在第一種情況下進入圖片。 – Braj

+1

@Braj謝謝!這個數字真棒。 – Ryan

回答

4

問:這兩個代碼是否調用String(char [])的相同構造函數?

不,絕對不是。

第一個表單將字符串內容直接燒製成字節碼,然後使用ldc(加載常量)指令從字符串池加載它。

重要的是,發生字符串常量「hello」會引用同一個對象。

與您的第二個表單進行比較,每次執行語句時都會創建一個新的字符串。

至於該領域的最終細節:無論如何這是一個私人領域,所以你不應該在意。但它是最終的,因爲Java字符串是不可變的 - 沒有理由爲什麼想要來改變它的值。 (在本身是不夠的,執行不變性;任何人都可以訪問該char[]可以修改數組的內容。)

+0

你是說''a「==」a「'但是,'new String(」a「)!= new String(」a「)'? –

+0

@JuanMendes沒錯。 –

+0

爲什麼設置字符串是不可變的?我知道在JAVA中有一個名爲StringBuilder的類是可變的。爲什麼不把這兩個類組合成一個? – Ryan

0
Question: Are the two codes invoking the same constructor of String(char[])? 

你假定「hello」是一個char [],但它不是,它是一個String。您可以調用字符串方法它,就像"hello".charAt(0)

所以在:

String s = "hello"; 

沒有構造函數被調用。 「你好」已經是一個字符串,並被分配給變量s

而且在

String s = new String("hello"); 

構造String(String)被調用。

對於第二個問題:value是最終的,因爲在Java中,字符串是不可變的。

2

我敢肯定,這是其他地方的回答,但我懶得看它 -

當你申報了「字符串文字」,在Java中,字面被分配在一個Java String對象包含類的類加載。 (順便說一下,字符串是「interned」的。)

所以當你說String s = "Hello";時,你只是將一個對預先存在的String對象的引用賦值給變量s,並且無論程序中有多頻繁你做這個任務,你不會創建任何更多的String實例。另一方面,總是創建一個新的String對象。

String對象中的char[]數組是存儲String實際值的位置。

(注意,String是不可變的 - 你不能改變它曾經創造當你分配一個新值,則現有的String參考,您正在分配對象,而不是更新現有String對象。)

0
String s = "hello"; 

s是一個String Litteral

參考引述引用JLS關於String litterals的部分:

(..)一個字符串常量指的是String類的同一個實例。這是因爲字符串文字 - 或者更一般地說是常量表達式(§15.28)值的字符串 - 被「interned」,以便使用方法String.intern。(..)

String s = new String("hello"); 

現在這是通過調用String constructor with a single String argument來創建一個String對象的引用。

Are the two codes invoking the same constructor of String(char[])? 

不,there isn't a call within this constructor to the overloaded constructor you are referring to

String has a private final field char value[]. Why is it set to a final field? 

因此,它不能被構造函數設置一次。這是String用作immutable object所需的步驟之一。