有一個面試問題:在字符串中創建多少個實例str1 = new String(「abc」)?
多少實例將在此語句創建:
String str1 = new String ("abc")
答案是2:str1
和。
這是正確的嗎?
有一個面試問題:在字符串中創建多少個實例str1 = new String(「abc」)?
多少實例將在此語句創建:
String str1 = new String ("abc")
答案是2:str1
和。
這是正確的嗎?
否 - 在堆中只創建了一個實例。字面上的「abc」進入游泳池。編譯並執行javap,你將在字節碼中看到只有一個新的。
考慮這個講座
public class InstanceTest {
public static void main(String... args){
String str1 =new String ("abc");
}
}
如果我們編譯並做 -
的javap -c InstanceTest
我們GET-
public class InstanceTest {
public InstanceTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String abc
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
}
「abc」將會轉到字符串池,不是嗎? –
@ d'alar'cop是的。 –
str1和一個瓦里可以參考,而不是Object和「ABC」是字符串文字,而不是Object
我認爲,對堆
只有一個實例在運行時創建只創建一個實例。加載類時,文字將在字符串池中執行,但從技術上講,JVM創建的實例並將其保留在字符串池中。表達式new String("abc")
創建String
的實例。
字符串文字是類字符串(第4.3.1節,§4.3.3)的實例的引用。
此外,字符串常量指的是類String的同一個實例。這是因爲字符串文字 - 或者更一般地說是常量表達式(§15.28)值的字符串 - 被「實施」,以便使用方法String.intern共享唯一實例。
此外,閱讀JLS 15.28
編譯時String類型的常量表達式總是「實習」,以便共享獨特實例,使用該方法的String.intern。
推薦閱讀:
+1。我認爲「實習生」這個詞讓人感到困惑。如果已經創建了「abc」並放置在sting pool中,那麼jvm不必創建一個。它可以指的是現有的。如果不存在,則必須創建一個並將其放置到池中。然後「新」關鍵字也增加了混淆,當語句是「當你用」新「關鍵字實例化,一個新的對象被創建」..這使得它聽起來像「abc」將不會被創建,因爲強大「新」沒有使用。 「abc」只是在那裏神奇地。 –
String s1 = new String(「hello」); ,在JVM級別創建多少個引用?我知道兩個對象:1在類加載「hello」時,1在實際執行命令時。 1的引用是s1,我的疑問是還有第二個引用s2,它是在類加載時傳遞給「new String()」構造函數的「hello」字符串的結果。在java中,我們不可能在一個函數或構造函數中傳遞一個對象本身,我們只能傳遞一個引用。另外,應該有第三個引用s3,它應該是新String(「hello」)的結果,然後分配給s1? –
的新關鍵字只能創建一個實例,並在你的榜樣,你把對象的引用到STR1(注:否則會被垃圾收集器被刪除)。
您將創建兩個String實例。 使用字符串構造函數而不是將它們聲明爲文字將始終創建不同的實例。
剛剛嘗試下面的代碼:
String str = "abc";
String str2 = "abc";
String newString = new String(str);
System.out.println("Are " + str + " and " + newString + " the same instance? " + (str == newString));
System.out.println("Are " + str + " and " + str2 + " the same instance? " + (str == str2));
字符串只有一個實例將被創建,由於Java編譯器具有智能以避免不必要的創建字符串objects.It將文件編譯爲一個類文件它試圖儘可能優化代碼。
2是正確的,當用「ABC」的Java常量池中創建一個「ABC」例如,使用新的(「ABC」),它建立在堆另一個字符串實例。
我覺得答案是1,因爲「abc」被攔截,並且創建的唯一「實例」是堆中的「str1」 – sanbhat