2010-02-01 206 views
8

在接受記者採訪時的問題,面試官問我分配和創建實例的字符串有什麼區別?

什麼是共同和區別以下語句之間:

String s = "Test"; 

String s = new String("Test"); 

是否有內存分配有什麼區別?

+0

http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-java – 2010-02-01 08:36:08

回答

6
String s = "Test"; 

將首先查找的字符串常量池中的字符串「測試」。如果找到了,將會引用找到的對象。如果沒有找到,則創建一個新的String對象,將其添加到池中,並使s指向新創建的對象。

String s = new String("Test"); 

將首先創建一個新的字符串對象,並s請參閱它。此外,字符串「測試」的條目在字符串常量池中進行,如果尚未存在,則爲

因此,假設字符串「Test」不在池中,第一個聲明將創建一個對象,而第二個聲明將創建兩個對象。

+1

據我瞭解,常量中的查找/對象創建池會在加載該類時出現在類代碼中的所有文字中,而不是在執行該特定代碼行時發生。 – 2010-02-01 10:43:19

5

內存條款的不同之處在於表單形式: String s = "test"使用「interned」字符串以共享唯一實例。

形式的調用:String s = "test"
相比String s = new String("test")

第一呼叫利用了現有的常量表達式的(如果有的話), 第二呼叫而不使用的創建一個新的實例是有效的任何現有的實例。

下面代碼塊說明了這一點:

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

還要注意,JLS指定行爲是這樣的:
每個字符串文字是String類的實例(§4.3.3的參考)。字符串對象具有一個常數值。字符串文字 - 或者更一般地說,是常量表達式的值的字符串是「interned」的,以便使用方法String.intern共享唯一的實例。

0

第一個將搜索字符串池中的字符串文字「Test」,如果它存在,那麼s將引用它,並且不會創建新字符串。並且僅當「測試」文字不存在時才創建新對象。

但在第二種情況下,它會創建另一個對象,而不會打擾它是否存在。

1

String s =「Test」; //創建一個String對象和一個引用變量 在這種簡單的情況下,「Test」將進入池中,s將引用它。

String s = new String(「Test」); //創建兩個對象和一個引用變量 在這種情況下,因爲我們使用了new關鍵字,Java將在正常(非池)內存中創建一個新的String對象 ,並且s將引用它。另外,文字「測試」將 放置在池中。

但它們的共同之處在於它們都創建了一個新的String對象,其值爲 「Test」,並將其分配給引用變量s。

0

+創建一個新的String對象和創建引用之間的區別不過是我們告訴jvm創建一個新的對象。 並創建refence意味着我們只創建我們自己的對象。

+0

不是問題。 – Luv 2012-12-18 07:08:22

相關問題