Java 字符串转换-原语和字符串值的对比输出

Java 字符串转换-原语和字符串值的对比输出,java,string,Java,String,在下面提到的程序中,对比字符串和原语值的输出。这在内部是如何工作的 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??

在下面提到的程序中,对比字符串和原语值的输出。这在内部是如何工作的

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??


}
}   
String.valueOf(“99”)
返回传递给它的相同实例(因为
valueOf(Object obj)
返回
对象的
totString
String
toString
返回
)。由于两个
“99”
字符串都是相同的实例(由于
字符串
池),因此对
字符串.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;
}
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);
}
另一方面,对
String.valueOf(99)
的每次调用都会调用
Integer.toString(99)
,从而生成一个新的
String
实例

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;
}
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);
}
public静态字符串值of(int i){
返回整数.toString(i);
}
公共静态字符串toString(int i){
if(i==Integer.MIN_值)
返回“-2147483648”;
int size=(i<0)?stringSize(-i)+1:stringSize(i);
char[]buf=新字符[大小];
getChars(i,大小,buf);
返回新字符串(buf,true);
}

@Jon我认为这不是一个合适的骗局。我的意思是,当然,你不会像这样比较字符串值;但这并不能解释为什么引用在一种情况下是相同的,而在另一种情况下是不同的。@AndyTurner:你可能是对的。重新开始。这不是重复的问题。根据选择字符串或基元类型作为参数,输出会有所不同。