Integer和int的区别

来源:互联网 发布:js python开发网页游戏 编辑:程序博客网 时间:2024/06/16 21:07

在谈到Integer与int的区别时,估计大多数人只会说到以下几点:

(1)Ingeter是int的包装类,是一个类,int是基本类型(注意Integer作为方法参数时传递的还是值,不是地址,请看总结第五点)。

(2)int的初值为0,Ingeter的初值为null。

(3)int 是在栈里创建的,Integer是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。效率上面int完胜。

但是在涉及比较、装箱拆箱和缓存等操作时还有很多可探究的地方。下面我结合代码来总结一下。

     首先看代码:

public class IntegerTest {    public static void main(String[] args) {        int i = 21;        Integer t1 = 21;        Integer t2 = new Integer(21);        System.out.println(i == t1);  //true,int与Integer(无论new是否)相比,Integer都会自动拆箱与int相比,都相等        System.out.println(i == t2);  //true        System.out.println(t1 == t2); //false,Integer(常量池中)和new Integer对象(堆中)相比,地址永远不相等        Integer m1 = 127;//在编译这句时会被翻译成Integer m1 = Integer.valueOf(127),执行int的装箱过程,源码请看后面        Integer m2 = 127;        System.out.println(m1 == m2); //true,两个非new的Integer对象相比,在-128~127中进行缓存,这个范围则相等        Integer n1 = 128;        Integer n2 = 128;        System.out.println(n1 == n2); //false,不在-128~127这个范围则不会缓存,不相等        Integer g1 = new Integer(2);        Integer g2 = new Integer(2);        System.out.println(g1 == g2); //false,两个都是new出来的Integer永远不相等,在堆中的两个不同地址    }}
输出结果:

truetruefalsetruefalsefalse

总结:

(1)int与Integer(无论new是否)相比,Integer都会自动拆箱与int相比,都相等。

(2)Integer(常量池中)和new Integer对象(堆中)相比,地址永远不相等。

(3)两个非new的Integer对象相比,在-128~127中进行缓存,这个范围则相等。(重点

     Java在编译Integer m1= 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127),这是int的装箱过程,请看valueOf函数式源码:

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

     看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer m1= 127时,会将127进行缓存,下次再写Integer m2= 127时,就会直接从缓存中取,就不会new了。m1==m2的结果为true,而n1 == n2结果为false。

(4)两个都是new出来的Integer永远不相等,在堆中的两个不同地址。

(5)Integer作为一个类,作为方法参数传递时,传递的还是值,而不是地址。请看具体Demo:

public class IntegerValue {    public static void fun(Integer i){        i=i+2;    }    public static void main(String[] args) {        Integer p = new Integer(5);        fun(p);        System.out.println(p);    }}
输出结果:5,表示Integer传递的是值,不会修改原有对象的值。
(6)在前面我们讲到拆箱装箱过程,请注意:在==比较时只会经历拆箱过程,在=赋值时会出现拆箱和装箱过程。