整数类对象

时间:2011-11-22 09:16:41

标签: java

我有一段代码:

public class Test{
    public static void main(String args[]){
        Integer a = 100;
        Integer b = 100;
        Integer c = 5000;
        Integer d = 5000;

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        if(a == b)
            System.out.println("a & b Both are Equal");
        else
            System.out.println("a & b are Not Equal");
        if(c == d)
            System.out.println("c & d Both are Equal");
        else
            System.out.println("c & d are Not Equal");
    }
}

我不明白为什么输出是这样的? Output是:
a & b Both are equal
c & d are not equal
我正在使用jdk1.7

4 个答案:

答案 0 :(得分:7)

这是由于虚拟机中的优化将小(常用)整数映射到重用的对象池。 This answer解释了一些细节。

答案 1 :(得分:4)

看起来java编译器正在使用Integer对象的缓存值。仅为小的inetger值填充此缓存。值100在缓存中,因此重新使用该对象。 5000的值不在cahce中,因此每次都会创建新对象。

对象相等的==比较测试,而不是值相等因此,为什么缓存的对象被认为是相等的而其他的不是。

答案 2 :(得分:2)

您正在使用Integer运算符比较==个对象的地址,编译器必须简单地重复使用a和{{1同一个变量但不是bc对象的对象。如果使用d方法测试相等性,那么您将获得所需的结果:

equals

答案 3 :(得分:0)

拳击转换 拳击转换将基本类型的值转换为引用类型的对应值。具体来说,以下8个转换称为装箱转换:

从类型布尔值到类型布尔值 从类型字节到类型字节 从类型char到类型字符 从短类型到短类型 从int类型到Integer类型 从类型long到类型Long 从类型float到类型Float 从double类型到Double类型 在运行时,拳击转换如下进行:

如果p是boolean类型的值,那么装箱转换将p转换为类的引用r并输入Boolean,这样r.booleanValue()== p 如果p是byte类型的值,那么装箱转换将p转换为类的引用r并键入Byte,这样r.byteValue()== p 如果p是char类型的值,那么装箱转换将p转换为类的引用r并键入Character,这样r.charValue()== p 如果p是short类型的值,那么装箱转换将p转换为类的引用r并输入Short,这样r.shortValue()== p 如果p是int类型的值,那么装箱转换将p转换为类的引用r并输入Integer,这样r.intValue()== p 如果p是long类型的值,那么装箱转换将p转换为类的引用r并输入Long,这样r.longValue()== p 如果p是float类型的值,则: 如果p不是NaN,那么装箱转换将p转换为类的引用r并输入Float,这样r.floatValue()的计算结果为p 否则,装箱转换将p转换为类的引用r并键入Float,使得r.isNaN()的计算结果为true。 如果p是double类型的值,那么 如果p不是NaN,则装箱转换将p转换为类的引用r并输入Double,这样r.doubleValue()求值为p 否则,装箱转换将p转换为类的引用r并输入Double,使得r.isNaN()的计算结果为true。 如果p是任何其他类型的值,则装箱转换等同于标识转换(5.1.1)。 如果被装箱的值p为true,false,一个字节,范围为\ u0000到\ u007f的char,或者介于-128和127之间的int或短号,则让r1和r2为任意两个装箱转换的结果p。始终是r1 == r2的情况 好读 - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7