簡體   English   中英

Java:String a = Integer.toString(1); 創造了多少個對象?

[英]Java : String a = Integer.toString(1); creates how many objects?

我看過聲明說:

String a = new String("1");

在堆上創建2個對象,一個由a引用,一個從String文字池中引用

但是,怎么樣:

String a = Integer.toString(1);

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

檢查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);
}

它會創建零對象,因為JVM會優化它;-)

換句話說:我相信這個問題的答案與底層虛擬機相比,與Java相關。

它將在Integer.toString的實現中創建兩個:一個char[] ,然后將它轉換為的String

只要滿足方法的公共契約,方法的內部實現可以創建任意多個。

也就是說,查看當前的實現,唯一的附加對象(除了返回引用的String)是:

    char[] buf = new char[size];

在OpenJdk實現中 ,創建一個char數組,然后從中創建一個String。

一次:

String a = new String("1");

執行它將創建至少兩個(如果不是更多)對象。 顯然它會創建一個String ,它可能包含一個private char[] intern圖中還會有一個新條目,可能包含多個對象。 所以 - 總結 - 至少兩個,也許四個甚至更多。

從那時起 - 它應該只創建一個對象String char[]將從實習生地圖中共享。

每次執行

String a = Integer.toString(1);

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

一般來說 - 它取決於JVM。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM