自动装箱、拆箱
package day1; public class Change { public static void main(String[] args) { int data1=100; int data2=100; Integer integer1=new Integer(data1); //将int类型打包成Integer类型 Integer integer2=new Integer(data2); System.out.println(data1/3); //基本类型的算法 System.out.println(integer1.doubleValue()/3); //包装器类型调用方法转换为double类型 System.out.println(integer1.compareTo(integer2)); } }
1.打包基本类型
java中的基本类型要想像对象一样使用,需要被打包器打包,打包器有Long、Integer、Double、Float、Boolean、Byte。
上面的打包器对象integer1调用doubleValue()方法,变为double类型,运算结果为3.3333333333.
2.自动装箱与拆箱
jdk1.5之后,为了简洁代码,提供了自动装箱和拆箱功能。
Integer i=10;
自动将int类型打包为Integer类型。
int t=i;
自定将被打包的Integer类型的int类型值赋给t。
在运算时也会自动进行自动装箱和拆箱。
Integer i=10; System.out.println(i+9);//运算时完成自动拆箱。
3.装箱内幕
Integer i=1;
编译器在编译期间会自动将代码扩展为:Integer i=Integer.valueOf(1);
我们查看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); }
如果传入的值在IntegerCache.low 到IntegerCache.high之间,那么Integer对象i的值存在缓存中,如果后面传入相同的值,那么会看看缓存中有没有这个值,有就会取这个值。
如果超出这个范围(-128-127),就会在内存中创建一个新的对象。
package day1; public class Change { public static void main(String[] args) { Integer integer1=100; Integer integer2=100; Integer integer3=200; Integer integer4=200; System.out.println(integer1==integer2); System.out.println(integer3==integer4); } }
结果为:true
false