2016-07-26 166 views
1

在下面提到的程序中,對比字符串和原始值的輸出。這是如何在內部工作?原始字符串和字符串值的字符串轉換對比輸出

public class Test { 

    public static void main(String[] args) { 

     String s1 = String.valueOf(99); 
     String s2 = String.valueOf(99); 
     System.out.println(s1==s2); //returns false, why?? 

     s1 = String.valueOf("99"); 
    s2 = String.valueOf("99"); 
     System.out.println(s1==s2); //returns true, why?? 


} 
} 
+0

@Jon我不認爲這真的是合適的騙局。我的意思是,當然,你不會比較這樣的字符串值;但是這並不能解釋爲什麼參考文獻在一種情況下是相同的,而不是另一種。 –

+0

@AndyTurner:你可能是對的。重啓。 –

+0

這確實不是重複的問題。輸出根據選擇String或原始類型作爲參數而變化。 –

回答

3

String.valueOf("99")返回傳遞給它的相同實例(因爲valueOf(Object obj)返回該ObjecttotStringStringtoString返回this)。由於兩個"99"字符串都是相同的實例(由於String池),所以兩個對String.valueOf("99")的調用返回相同的實例。

public static String valueOf(Object obj) { 
    return (obj == null) ? "null" : obj.toString(); 
} 

/** 
* This object (which is already a string!) is itself returned. 
* 
* @return the string itself. 
*/ 
public String toString() { 
    return this; 
} 

在另一方面,每次調用String.valueOf(99)調用Integer.toString(99),其產生的新String實例。

public static String valueOf(int i) { 
    return Integer.toString(i); 
} 

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(buf, true); 
}