我使用JDK1.4和1.5运行这段代码,得到不同的结果。为什么是这种情况?
String str = "";
int test = 3;
str = String.valueOf(test);
System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]");
if (str == "3") {
System.out.println("if");
} else {
System.out.println("else");
}产出:
发布于 2013-08-01 05:30:48
根据this page,Integer#toString方法(由String#valueOf(int)调用)在1.4中实现如下:
public static String toString(int i) {
switch(i) {
case Integer.MIN_VALUE: return "-2147483648";
case -3: return "-3";
case -2: return "-2";
case -1: return "-1";
case 0: return "0";
case 1: return "1";
case 2: return "2";
case 3: return "3";
case 4: return "4";
case 5: return "5";
case 6: return "6";
case 7: return "7";
case 8: return "8";
case 9: return "9";
case 10: return "10";
}
char[] buf = (char[])(perThreadBuffer.get());
int charPos = getChars(i, buf);
return new String(buf, charPos, 12 - charPos);
}这将解释您的结果,因为字符串文本"3"是内部的,而"3" == "3"总是返回true。
您可以使用10和11来验证这一点。
注意:正如前面提到的,Integer#toString的javadoc并没有说明返回的字符串是否会被嵌入,所以问题中的两个输出都是同样有效的。
发布于 2013-08-01 05:18:17
这是JLS没有指定的实现细节。
引用相等操作符==检查两个变量是否指向同一个实际对象,而equals方法检查两个变量的值在某种程度上是否“相等”,而这些值可能由程序员确定。在这种情况下,1.4JVM似乎利用了一个事实,即String是不可变的,在调用valueOf时重用字符串valueOf的相同副本,而1.5JVM不是。这两个选项都是完全合法的,您不应该依赖于任何特定的此类行为。
发布于 2013-08-01 06:25:38
来自java 5的 string.valueof()预期将返回新的字符串。而不是实习生(Ed)(共享)字符串!
请考虑以下示例
int test = 3;
String str = String.valueOf(test);
String str2 = String.valueOf(test);
if(str == str2)
System.out.println("valueOf return interned string");
else
System.out.println("valueOf does not return interned string");在java >=5中输出
valueOf does not return interned string但是在java 4中,输出是
valueOf return interned string这就解释了他们的行为!
https://stackoverflow.com/questions/17985427
复制相似问题