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。
四:总结五:Plus所有整型包装类对象之间值的比较,全部使用 equals() 方法比较。
- 将基本数据类型转换为包装类称为装箱,将包装类转换为基本数据类型称为拆箱
- 在JDK1.5以前,需要手动装箱和拆箱,在JDK1.5及以后,支持自动装箱和拆箱
基本数据类型称为拆箱** - 在JDK1.5以前,需要手动装箱和拆箱,在JDK1.5及以后,支持自动装箱和拆箱
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)