2015-06-20 115 views
0

我有一个关于比较字符串和整数对象的问题...混淆字符串与整数

a。比较字符串引用:

String string1 = "Hi"; 
    System.out.printf("%s \n", string1); 
    String originalString = string1; 
    System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString == string1); 
    System.out.println(); 

    string1 += " there"; 
    originalString += " there"; 
    System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString.equals(string1)); 
    System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString == string1); 

产生的输出:

Hi 
    Hi  Hi   true 

    Hi there Hi there true 
    Hi there Hi there false 

这里,最后一行比较地址和可以预料的作假。 目前为止;)

b。比较整数引用:

Integer integer1 = 10; 
    System.out.printf("%d \n", integer1); 
    Integer originalInteger = integer1; 
    System.out.printf("%d %d %b \n", integer1, originalInteger, originalInteger == integer1); 
    System.out.println(); 

    integer1++; 
    originalInteger++; 
    System.out.printf("%d %d %b \n", integer1, originalInteger, originalInteger == integer1); 

产生的输出:

10 
    10 10 true 

    11 11 true 

到最后一行打印出来的时候,这两个“整数1”和“originalInteger”被引用完全不同的对象......尽管如此

originalInteger == integer1 --> true ??? 

这是否意味着不是对象的地址,而是对象的内容进行比较? 换句话说,是否因为使用类型包装器,在比较之前这些值始终是“拆箱”的?

因此,恢复:

originalString == string1  --> false 
originalInteger == integer1  --> true 

我不明白为什么originalInteger ==整数1 - >真

谢谢

+0

有关此的以前的问题包括http://stackoverflow.com/q/3130311/978917,http://stackoverflow.com/q/1700081/978917,http://stackoverflow.com/q/15024933/978917,和其他许多人。 – ruakh

回答

0

==比较对象的引用( “地址”,就像你所说的那样),正如你理解(正确)String的例子。

当您将++运营商的Integer,你实际上它outboxing为原始int,增加它,自动装箱回一个Integer,所以理论上,你可以得到一个不同的对象那里。然而,Integer类在这里扮演一个“肮脏”的诡计(阅读:整洁的优化)。对于高达127(含)的值,Java保持高速缓存Integer s,并在该值自动复制时返回相同的对象。所以,事实上,你会得到相同的对象,所以originalInteger == integer1将返回true。如果你用一个更大的整数重复这个例子,比如说500,你会得到像你期望的false

+0

回复:“如果你用一个更大的整数重复这个例子,我们假设'500',你会得到像你期望的那样的'false':这不是规范保证的。规范说,理想情况下,值相等意味着所有自动绑定整数的引用平等,但这在所有实现中都不可行,所以它只需要这个范围为[-128,127]的整数。对于该范围以外的整数,它既不需要也不禁止它。 – ruakh