在下面提到的程序中,字符串和原始值的对比输出。这是如何内部工作的?
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 :(得分:3)
String.valueOf("99")
会返回传递给它的同一个实例(因为valueOf(Object obj)
会返回Object
' s totString
和String
' s toString
返回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);
}