2013-04-22 18 views
2

我所看到的語句說:Java:String a = Integer.toString(1);創建多少個對象?

String a = new String("1"); 

創建2個對象,都在堆,一個由大約引用,一個是從字符串文字池

REF-ED但是,如何:

String a = Integer.toString(1); 

它會創建2個對象還是1? 我認爲它創造了2,我正確嗎?

+5

它可能會在'Integer.toString'的內部實現中創建更多。 – 2013-04-22 15:41:23

回答

4

檢查Integer#toString(int)的來源。它返回一個新的String對象。

public static String toString(int i) { 
    if (i == Integer.MIN_VALUE) 
     return "-2147483648"; 
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); 
    char[] buf = new char[size]; 
    getChars(i, size, buf); 
    return new String(0, size, buf); 
} 
+1

用於顯示代碼。 – Maroun 2013-04-22 15:54:22

+1

...並且該代碼顯示第二個對象:new char [size]。 – 2013-04-22 16:03:53

+0

@ AndyThomas-Cramer所以toStirng impl會在return.I回答'String a = Integer.toString(1);'Integer#toString(1)將創建的地方創建2個對象一個char []和新的String()一個新的字符串對象,而不是使用緩存的字符串。 – PermGenError 2013-04-22 16:07:02

2

它會創建兩個:一個char[]在執行Integer.toString,然後String它將其轉換爲。

1

該方法的內部實現可以創建儘可能多的,只要它滿足方法的公共契約。

這就是說,看着當前實現,只有額外的對象(除了其參考返回字符串)是:

char[] buf = new char[size]; 
3

它將創建零個對象,因爲JVM將優化它拿走;-)

換句話說:我相信這個問題的答案更多地與底層虛擬機相關,而不是Java。

0

第一時間:

String a = new String("1"); 

被執行,將至少創建兩個如果沒有更多的對象。顯然它會創建一個String,這可能包含一個privatechar[]intern地圖中還會有一個新條目,可能包含多個對象。所以 - 總之 - 至少有兩個,也許是四個甚至更多。

從此 - 然而,它應該只創建一個對象,Stringchar[]將從實習地圖共享。

每次執行

String a = Integer.toString(1); 

你將至少創建一個對象。顯然String和可能是一個新的char[],可能也許沒有別的。如果它使用上面創建的「1」的intern版本,您甚至不會創建char[]

一般來說 - 它取決於JVM。

+2

在Java中的字符串不是byte []數組,他們是char []數組... – Durandal 2013-04-22 15:49:00

+0

@Durandal - 感謝提醒 - 修正。 – OldCurmudgeon 2013-04-22 15:50:30

+1

字符串文字是在鏈接時建立的,最後我檢查了。也就是說,在代碼運行之前,「1」已經存在,作爲一個字符串。 – cHao 2013-04-22 16:12:24

0

案例一創建三個對象(char [],String常量和new String),不是兩個。案例二創建兩個對象(char []和新的String)。檢查了JRE 1.7.0_21源代碼,其他JRE可能會以不同的方式實現它。

+1

當包含它的類被加載時,字符串文字被添加到池中;構造函數和調用者都不會爲該調用創建它。由於字符串是不可變的,所以沒有什麼能夠阻止'String(String other)'簡單地複製其他字段,包括對其底層字符數組的引用。事實上,這正是它所做的,除非'other'的char數組在其中存在未使用的空間 - 對於String文本而言不應該如此。 – cHao 2013-04-22 15:58:12

+0

這就是我說的,不是嗎?技術委員會詢問了*聲明*,他沒有具體說明他是否要計算常量池分配(我假定他想,因爲他爲第一種情況假設了兩個對象)。 String常量在常量池中被分配爲普通的char []和String,這樣就產生了兩個對象,或者不是它? – Durandal 2013-04-22 16:14:35

+0

取決於問題是關於在代碼中使用聲明還是運行聲明,或者兩者兼而有之。在加載類時(除非在代碼的其他地方已經存在'「1」),創建至少兩個(char []和String),並運行它會創建一個。 – cHao 2013-04-22 16:18:53