从JDK5后开始,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能,下面就来讲解一下其内容
- 自动装箱:把基本类型转换为包装类类型
- 自动拆箱:把包装类类型转换为基本类型
原理:自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。
好处:让基本类型也具有对象的特征,就出现了包装类型,将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作,大大提高了开发效率
Integer num =5; //自动装箱
5是int类型,如果要把int类型赋值给Integer包装类,就需要自动装箱,相当于Integer num=Integer.ValueOf(5).
Integer a = new Integer(5); //自动拆箱
int b= a;
b是包装类,a=b是把b赋值给a,那么b这个包装类需要自动拆箱,相当于int a = b.intValue();
我们举几个例子来着重理解一下自动装箱和拆箱机制
==符号判断的是a和b在堆中所指向的对象是不是同一个;equals比较两个对象其结果是true当且仅当该参数不是null并且是Integer对象包含相同int值。
// 题目一
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true
System.out.println("-----------");
// 题目二
Integer i3 = 127;
Integer i4 = 127;
System.out.println(i3 == i4); //true
System.out.println(i3.equals(i4)); //true
System.out.println("-----------");
// 题目三
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);
System.out.println(i5.equals(i6)); //true
// 题目四
int i7=59;
Integer i8=new Integer(59);
System.out.println(i7==i8); //true
题目一:为false的原因是生成了两个不同的对象i1,i2存放于堆中,那么这个结果就一定是false;equals结果只要两值相等就为true。
题目2:因为127这个值介于-128到127之间,在java内存的常量池中会存放一个127的常量,然后i3,i4两个对象都指向常量池中的127,所以判断为true。
题目3:因为129这个值超出了-128到127这个范围了,所以引用就不向常量池中进行引用了,就会重新生成一个129的Integer对象,故而i5,i6两个是不同对象,所以是false。
题目4:i7==i8是比较i7,i8;i7是基本数据类型,i8是包装类,这个时候包装类就会自动调用intValue()方法转换为基本数据类型,从而和i7就是相等的,所以为true。
public static Integer valueOf(int var0) {
return var0 >= -128 && var0 <= IntegerCache.high ? IntegerCache.cache[var0 + 128] : new Integer(var0);
}
注意:除double和float两种类型以外,其他基本类型入Integer值在 -128 ~ 127之间时不会新建一个Integer 对象而是从缓存中获取。所以在做 == 判断时要注意值的大小,如果超过范围,则两个值 即使一样但 == 比较的结果还是false。