1.自动装箱(Autoboxing)
基本数据类型不是对象,没有可以调用的方法,可以使用它的包装类型来调用一些如toString(),getClass()之类的方法。
如:Integer i = 10; 这时编译器实际执行的是 Integer i = Integer.valueOf(10);
这就是自动装箱。自动装箱就可以把一个基本数据类型子动变成一个包装类型。
使用反编译软件查看:
2.自动拆箱(unboxing)
自动拆箱跟自动装箱相反,自动拆箱是把Integer这样的包装类型重新简化为基本数据类型。
如: int k = new Integer(2); 这时编译器实际执行的是int k = new Integer(2).intValue();
这就是自动拆箱。使用反编译软件查看:
3.基本数据类型对应的包装类型的自动装箱池大小
- Byte,Short,Integer,Long默认情况下是-128~127
- Character的是0~127
- Float和Double没有自动装箱池
4.装箱池的作用
在装箱池指定的范围内会有缓存对象,加入是在范围的值会直接取已有的缓存对象,而不会new一个。
例如:
public static Integer valueOf(inti) {
if(i >= -128 &&i <=IntegerCache.high) // 没有设置的话,IngegerCache.high 默认是127
//如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象
return IntegerCache.cache[i + 128];
else
return new Integer(i); //否则就在堆内存中创建
}
5.实例
Integer integer1 = 100;
Integer integer2 = 100;
Integer integer3 = 200;
Integer integer4 = 200;
Integer integer5 = new Integer(100);
Integer integer6 = new Integer(100);
int int1 = 100;
int int2 = 200;
System.out.println("integer1==integer2: " + (integer1 == integer2));
//ture 自动装箱,两个缓存中的Integer对象的引用来进行比较,所以是true
System.out.println("integer1.equals(integer2): " + (integer1.equals(integer2)));
// true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true
System.out.println("integer3==integer4: " + (integer3 == integer4));
// false 自动装箱,两个非缓存对象,而是new出来的不同对象的引用进行比较,所以为false
System.out.println("integer3>integer4: " + (integer3 > integer4));
// false 自动拆箱,再比较大小 ,明显不成立
System.out.println("integer3.equals(integer4): " + (integer3.equals(integer4)));
// true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true
System.out.println("integer5==integer6: " + (integer5 == integer6));
// false 两个不同的Integer对象引用的比较肯定为false
System.out.println("integer5.equals(integer6): " + (integer5.equals(integer6)));
// true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true
System.out.println("integer1==int1: " + (integer1 == int1));
// true 将Integer缓存对象拆箱后与int比较,即两个int类型进行比较,所以为true
System.out.println("integer1.equals(int1): " + (integer1.equals(int1)));
// true 重写的equals方法中的方法参数是Object类型,不能传一个基本数据类型的参数进去,所以发生了自动装箱,
// int1被自动装箱为Integer类型,而Integer类型的最终父类是Object类型,然后就是两个Integer
// 类型进行equals比较
System.out.println("integer3==int2: " + (integer3 == int2));
// true Integer对象拆箱后与int比较,所以为true
System.out.println("integer3.equals(int2): " + (integer3.equals(int2)));
// true 与倒3个输出原理相同
使用反编译查看
Integer integer1 = Integer.valueOf(100);
Integer integer2 = Integer.valueOf(100);
Integer integer3 = Integer.valueOf(200);
Integer integer4 = Integer.valueOf(200);
Integer integer5 = new Integer(100);
Integer integer6 = new Integer(100);
int int1 = 100;
int int2 = 200;
System.out.println("integer1==integer2: " + (integer1 == integer2));
System.out.println("integer1.equals(integer2): " + integer1.equals(integer2));
System.out.println("integer3==integer4: " + (integer3 == integer4));
System.out.println("integer3>integer4: " + (integer3.intValue() > integer4.intValue()));
System.out.println("integer3.equals(integer4): " + integer3.equals(integer4));
System.out.println("integer5==integer6: " + (integer5 == integer6));
System.out.println("integer5.equals(integer6): " + integer5.equals(integer6));
System.out.println("integer1==int1: " + (integer1.intValue() == int1));
System.out.println("integer1.equals(int1): " + integer1.equals(Integer.valueOf(int1)));
System.out.println("integer3==int2: " + (integer3.intValue() == int2));
System.out.println("integer3.equals(int2): " + integer3.equals(Integer.valueOf(int2)));