美文网首页程序员
Java中关于int与Integer的区别

Java中关于int与Integer的区别

作者: 大侠陈 | 来源:发表于2018-10-15 13:41 被阅读8次

    java中的int和Integer虽然都表示整数,可它们实际上是不同的,如果不理解其中区别有时候会出现莫名其妙的问题。

    我们来看下面几种情况

    int  a = 1;
    int b =1;
    System.out.println(a==b)
    

    比较结果为true,这符合正常逻辑,1==1结果自然为true

    Integer a= new Integer(1);
    Integer b= new Integer(1);
    System.out.println(a==b)
    

    比较结果却为false,因为a和b是两个不同的对象,虽然值都为1,可引用的地址却不同,为对象应用==运算符, 比较的是应用地址,为值类型应用==运算符,比较的才是真正的值,这里是比较对象,结果就为false了。

    Integera = 127;
    Integerb = 127;
    System.out.println(a ==b);
    

    比较结果为true,这令人疑惑,上面不是说Integer类型是比较引用的, 那么这里是两个不同的对象,以为着有不同的引用,结果为何为true。 这是因为直接为Integer类型赋值值类型时设计到一个自动装箱操作,编译器会调用Integer.valueOf方法来实现这个效果,实际上编译起执行的代码大概是像下面这样子的

    Integer a = Integer.valueOf(127);
    Integer b = Integer.valueOf(127);
    System.out.println(a ==b);
    

    我们再看valueOf方法的代码

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low &&i <= IntegerCache.high)
        return IntegerCache.cache[i +(-IntegerCache.low)];
        return new Integer(i);
    }
    

    当参数值在-128和127之间时,返回的是IntegerCache.cache中的缓存值,因此结果才为true,因为valueOf返回的是同一个对象。而当参数值不在范围内时,valueOf方法会通过newInteger创建一个新的对像, 所以

    Integer a = 128;
    Integer b = 128;
    System.out.println(a ==b);
    

    以上代码执行的结果就为false了,因为每次调用valueOf方法,方法都回调用new Integer创建一个全新对象,而不是复用缓存中的对象。

    int a = 128;
    Integer b = 128;
    System.out.println(a ==b);
    

    结果为true, 因为当把Integer类型与int比较时, 编译器会味Integer类型执行拆箱操作:将Integer转换为int, 那么时间上最终==运算符的两侧都会是int类型,对于值的比较只要值是相等的,那么结果即为true。

    综上所述,在不考虑性能的情况下,使用int而不适用Integer能提高程序的正确性,因为对int的数值操作逻辑更加简单安全。

    相关文章

      网友评论

        本文标题:Java中关于int与Integer的区别

        本文链接:https://www.haomeiwen.com/subject/oidfzftx.html