Integer和int的区别

xiaoxiao2021-02-28  81

在谈到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永远不相等,在堆中的两个不同地址 } }输出结果:

true true false true false false 总结:

(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)在前面我们讲到拆箱装箱过程,请注意:在==比较时只会经历拆箱过程,在=赋值时会出现拆箱和装箱过程。

转载请注明原文地址: https://www.6miu.com/read-79581.html

最新回复(0)