关于String vs Integer的困惑

时间:2015-06-20 07:21:54

标签: java string integer

我有一个关于比较String和Integer对象的问题......

一个。比较字符串引用:

    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 

这里,最后一行比较地址,并且预期给出错误。 好到目前为止;)

湾比较整数引用:

    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 

当打印出最后一行时,'integer1'和'originalInteger'都引用了完全不同的对象......不过

   originalInteger == integer1   --> true  ???

这是否意味着不会比较对象的地址而是比较对象的内容? 换句话说,是否因为使用类型包装器,值在被比较之前总是“未装箱”?

所以,要恢复:

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

我不明白为什么originalInteger == integer1 - >真

谢谢

1 个答案:

答案 0 :(得分:0)

==比较对象的引用("地址",正如您所说),正如您对String示例的理解(正确)。

当您将++运算符应用于Integer时,实际上您将其发送到原始int,将其递增,并将其自动装箱回Integer ,理论上,你可以在那里得到一个不同的对象。但是,Integer课程会播放“肮脏的”#34;这里的技巧(阅读:整洁优化)。对于最大为127(包括)的值,Java会保留Integer的缓存,并在此值自动装箱时返回相同的对象。因此,实际上,您将获得相同的对象,因此originalInteger == integer1将返回true。如果你用一个更大的整数重复这个例子,让我们说500,你得到false就像你期望的那样。