2016-12-07 61 views
-3
public static void main(String[] args) { 
     String a = new String("abc"); 
     String b = "abc"; 
     String c = "abc" + "KDF" + "gh" +"rt" +"jk"; 

    } 

請在代碼的下面找到字節碼。在下面的代碼中創建的String對象的總數?

Compiled from "NumOfStringObject.java" 
public class com.practise.general.NumOfStringObject extends java.lang.Object{ 
public com.practise.general.NumOfStringObject(); 
    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/Strin 
g;)V 
    9: astore_1 
    10: ldc  #3; //String abc 
    12: astore_2 
    13: ldc  #5; //String abcKDFghrtjk 
    15: astore_3 
    16: return 

} 

我沒有閱讀/理解字節碼的經驗,我猜想總共有3個字符串對象正在創建。

讓我知道你的想法。

+0

是的那裏有3個字符串,你創建 – XtremeBaumer

+0

好的,謝謝,但爲什麼像「KDF」,「gh」,「rt」,「jk」這樣的中間對象沒有存儲在字符串池中。 – Lovesh

+0

@Lovesh我給了你指定的鏈接,這個行爲被定義爲 – xenteros

回答

-4

字符串是不可改變

在這裏閱讀討論。應該幫助你。 String is immutable. What exactly is the meaning?

簡而言之, 如果您見過您的代碼中更改其值的String變量,則可以安全地假定創建了一個新對象

String s = new String("some value"); 

String s = "some value"; 

都非常一致。當您使用=值沒有設置,但一個新的對象相同的參考s

下編輯實際創建: 對於「Downvoters」,得到的回答是YES 三個對象被創建

+5

這與如何在給定的代碼中創建多少個字符串有關?另外,在第一個語句中已經在字符串池中創建了「some value」,而's'僅僅被分配了一個現有的引用。與不變性無關。 – RealSkeptic

+1

創建的字符串數量與它們不可變的事實無關。並且當該值是一個已經在程序中使用的文字時,「當您使用'='該值未被設置,但實際上創建了一個新對象時」的說法是錯誤的。 – RealSkeptic

+0

@BrandonIbbotson這就是爲什麼我放一行「只要你看到字符串改變值,一個新的對象被創建」。不知道爲什麼這個答案完全誤導了 – madhairsilence

2
  1. 文字​​創建。
  2. 創建了與​​具有相同字符的字符串。
  3. 文字"abcKDFghrtjk"已創建。

Specification:在運行時通過串聯計算

"This is a string" // a string containing 16 characters 
"This is a " +  // actually a string-valued constant expression, 
    "two-line string" // formed from two string literals 

字符串被新創建,並因此是不同的。
通過常量表達式計算的字符串(§15.28)在編譯時計算,然後視爲它們是文字。

4

是的,三。乍一看,你會想更多,但編譯器將組合字符串常量; details in JLS§15.28 - Constant Expressions。因此,編譯器有效地處理您的main作爲主體:

String a = new String("abc"); 
String b = "abc"; 
String c = "abcKDFghrtjk"; 

還重用了在同等級的常數相同的字符串(這是interned,所以相同的字符串可以跨類使用爲好),這意味着只有一個​​由該代碼中的兩個出現​​文字創建。

所以:

  • 一位來自常數(字面)​​
  • 從另一個不變"abcKDFghrtjk"(相結合的結果幾個文字)
  • 一個​​您明確創建作爲一個單獨的對象第一行代碼通過new String
+0

您好Sir TJ,我想知道如果只是'字符串文字'只是在彙編中處理常量? – msagala25

+1

@msagala:每個規範都是一個常量值; [詳細信息](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28)。所以這是文字,也是['final'字符串變量和字段]的引用(https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4) (該規範有時會調用成員變量)。 –

相關問題