为什么JDK 1.4和1.5之间的输出不同?

omg*_*eee 11 java jdk1.5 jdk1.4

我正在使用JDK 1.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");
}
Run Code Online (Sandbox Code Playgroud)

输出:

ass*_*ias 11

根据这个页面,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);  
}
Run Code Online (Sandbox Code Playgroud)

这可以解释你的结果,因为字符串文字"3"被实习并且"3" == "3"总是返回true.

您可以尝试使用10和11来验证这一点.

注意:如前所述,javadoc Integer#toString并未说明返回的字符串是否会被实习,因此您问题中的两个输出都同样有效.

  • +1在Java 7中又是不同的.你不应该依赖这样的行为. (2认同)