2013-08-01 72 views
11

我使用JDK 1.4和1.5运行此代码并获得不同的结果。为什么会这样?为什么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 
    
+7

字符串相等性使用'“3”.equals(str)'而不是'=='运算符进行检查。 –

+0

这与JDK之间的差异无关,但是您了解如何在Java中使用“字符串”比较。查看我以前的评论 – MadProgrammer

+0

中提供的链接,以比较java中的对象相等性,您必须使用equals,如果它们引用同一个对象,则使用== ...如果它们被拦截,那么这就是您的真实情况。 – nachokk

回答

11

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没有说明返回的字符串是否会被执行,因此您的问题中的两个输出都是同样有效的。

+2

+1在Java 7中又是不同的。你不应该依赖这样的行为。 –

4

这是一IMP没有被JLS指定的详细说明。

引用相等运算符==检查两个变量是否指向相同的实际对象,而方法检查两个变量的值是否以程序员可以确定的某种方式“相等”。在这种情况下,看起来1.4 JVM正在利用String是不可变的事实,以便在调用valueOf时重用字符串"3"的相同副本,而1.5 JVM不是。两种选择都是完全合法的,你不应该依赖任何特定的行为。

0

如果在字符串文字操作中使用“==”运算符,则它取决于字符串文字值是否存在于“字符串池”中,在您的情况下,变量“str”是字符串JVM首先检查“字符串池”是否找到,然后返回TRUE else FALSE。试试下面的代码实习生()方法,根据对实习生()方法的文档,使可用的字符串字面的“字符串池”

String str = ""; 
int test = 3; 

str = String.valueOf(test).intern(); 

System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]"); 

if (str == "3") { 
    System.out.println("if"); 
} else { 
    System.out.println("else"); 
} 

: 实习生()方法搜索字符串的内部表一个等于这个String的字符串。如果该字符串不在表格中,则会被添加。解决与表中包含的字符串相同的字符串。对于相同的字符串,总是回答相同的字符串对象。

对于字符串比较,不建议使用“==”操作。使用equals()或equalsIgnoreCase()方法()。

我甚至在java中试过1。7 而不实习生()的输出是

str[3] 
equals result[false] 
else 

实习生()的输出来:

str[3] 
equals result[true] 
if 

这不是JDK 1.4的问题和1.5,这是一个“逻辑错误”。

1

从java 5 string.valueof()预计会返回新的字符串。而不是intern(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 

这解释了行为!

+0

您正在重申该操作已经观察到的内容。问题是:为什么1.4和1.5的行为有所不同。 – assylias

+0

因为在java中创建5个新字符串而不是intern(ed)(shared)字符串。看到第一个粗体行! –

相关问题