我们先来了解装箱和拆箱的基本概念:
装箱就是自动将基本数据类型转换为包装器类型;使用Integer.valueOf方法。
拆箱就是自动将包装器类型转换为基本数据类型;使用Integer.intValue方法。
举个例子:
Integer total = 99;
//执行上面那句代码的时候,系统为我们执行了,即自动装箱
Integer total = Integer.valueOf(99);int totalprim = total;
//执行上面那句代码的时候,系统为我们执行了,即自动拆箱
int totalprim = total.intValue();
我们可以从下面的两个问题来理解拆箱和装箱。
如下题目:
Integer i = 400;
Integer j = 400;
System.out.println(i==j); //false
Integer o = 12;
Integer k = 12;
System.out.println(o==12); //true
上面提到,使用 Integer去创建数据,其实是一个Integer.valueOf 过程,Integer.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之间,它就从高速缓存返回实例。否则 new 一个Integer对象。new Integer 就是一个装箱的过程了,装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。
所以说最后是i 和 j 两个对象比较,内存地址不一样,结果就是false了。
例子如下:
int a =200;
Integer b = new Integer(200);
Integer c = 200;
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(b==c); //false
分析: a==b,a==c,只要和基本数据类型(即 int)比较,Integer就会调用value.intValue()拆箱成基本数据类型,你也可以理解为:当有基本数据类型,只比较值b==c,这两个是永远不会相等的,拆箱装箱只是针对基本数据类型的比较才有,Integer并不是基本数据类型,b、c两者存放的内存地址不一样,所以不相等。
我们很容易得出以下结论:
(1)无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。
(2)两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
(3)两个都是new出来的,即两个new Integer比较,则为false。
(4)int与Integer、new Integer()进行==比较时,结果永远为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。
讲了这么多,其实我只是Java的搬运工,这些知识点都是从动力节点在线的视频课程中搬运过来的,想要学习更多的Java知识,可以观看动力节点在线的视频课程,开启你的全新Java学习之旅吧!
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54