2016-07-26 148 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); 
} 
相关问题