包装类–Integer和int比较的大坑
一:前提引入:
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);//false
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是常量池中的对象。而Integer i1 = new Integer(40)
会直接创建新的对象。因此,输出 false 。
二:装箱拆箱源码
- 装箱
-
Integer b=a; 这段代码等同于Integer b=Integer.valueOf ( a )
-
拆箱
- int a=b,这段代码等价于:int a=b.intValue()
三;相关题目
代码1好理解,a和b指向的是堆的两块不同的区域,所以他们是不相等的,输出fasle。
代码2也好理解,他是一个自动装箱的过程,会调用Integer.valueOf ( int i ) 方法,所以,他们c,d都不会创建新的对象,而是直接从常量池中拿。所以他们都是一样的,输出true.
代码3也是哥自动装箱的过程,调用Integer.valueOf ( int i )方法,判断不在缓存中拿,所以会在堆上创建新的对象,比较的时候当然是fasle.
代码4,int g=59,首先明白这个59是存储在哪里的?由于他是基本的数据类型,所以它是存在栈中的,Integer h=new Integer(59);这个会在堆中就创建一个对象存储的是59,但是由于代码执行到g==h的时候,这时一个是基本类型一个包装类型,他们相比较,h会发生自动拆箱的过程。即调用intValue()方法返回一个int类型,基本类型就是只比较数值,所以输出true。
四:总结
所有整型包装类对象之间值的比较,全部使用
equals()
方法比较。
五:Plus
- 将基本数据类型转换为包装类称为装箱,将包装类转换为基本数据类型称为拆箱
- 在JDK1.5以前,需要手动装箱和拆箱,在JDK1.5及以后,支持自动装箱和拆箱
基本数据类型称为拆箱** - 在JDK1.5以前,需要手动装箱和拆箱,在JDK1.5及以后,支持自动装箱和拆箱