Java中的自动拆装箱机制详解

从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。


这个源码就可以解释题目二的原理: **-128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取,如果超过了byte取值范围就会再新创建对象。**
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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章