我正在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");
}

输出:

JDK 1.4上的

  • str[3]
    equals result[true]
    if
    
  • JDK 1.5上的

  • str[3]
    equals result[false]
    else
    
  • 最佳答案

    根据this pageInteger#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并未说明返回的字符串是否将被保留,因此问题中的两个输出都同样有效。

    10-07 19:05
    查看更多