在接受記者採訪時的問題,面試官問我分配和創建實例的字符串有什麼區別?
什麼是共同和區別以下語句之間:
String s = "Test";
String s = new String("Test");
是否有內存分配有什麼區別?
在接受記者採訪時的問題,面試官問我分配和創建實例的字符串有什麼區別?
什麼是共同和區別以下語句之間:
String s = "Test";
String s = new String("Test");
是否有內存分配有什麼區別?
String s = "Test";
將首先查找的字符串常量池中的字符串「測試」。如果找到了,將會引用找到的對象。如果沒有找到,則創建一個新的String對象,將其添加到池中,並使s指向新創建的對象。
String s = new String("Test");
將首先創建一個新的字符串對象,並s請參閱它。此外,字符串「測試」的條目在字符串常量池中進行,如果尚未存在,則爲。
因此,假設字符串「Test」不在池中,第一個聲明將創建一個對象,而第二個聲明將創建兩個對象。
據我瞭解,常量中的查找/對象創建池會在加載該類時出現在類代碼中的所有文字中,而不是在執行該特定代碼行時發生。 – 2010-02-01 10:43:19
內存條款的不同之處在於表單形式: 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共享唯一的實例。
第一個將搜索字符串池中的字符串文字「Test」,如果它存在,那麼s將引用它,並且不會創建新字符串。並且僅當「測試」文字不存在時才創建新對象。
但在第二種情況下,它會創建另一個對象,而不會打擾它是否存在。
String s =「Test」; //創建一個String對象和一個引用變量 在這種簡單的情況下,「Test」將進入池中,s將引用它。
String s = new String(「Test」); //創建兩個對象和一個引用變量 在這種情況下,因爲我們使用了new關鍵字,Java將在正常(非池)內存中創建一個新的String對象 ,並且s將引用它。另外,文字「測試」將 放置在池中。
但它們的共同之處在於它們都創建了一個新的String對象,其值爲 「Test」,並將其分配給引用變量s。
+創建一個新的String對象和創建引用之間的區別不過是我們告訴jvm創建一個新的對象。 並創建refence意味着我們只創建我們自己的對象。
不是問題。 – Luv 2012-12-18 07:08:22
http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-java – 2010-02-01 08:36:08