自动装箱
Integer a = 99;
自动拆箱
int b = a;
因为Object类下的Number里有Integer,Integer是int的包装类,所以可以把Integer想象成一个箱子,把b装进这个箱子里,这就是自动装箱,同理,自动拆箱就是把这个b从箱子里取出来
自动装箱和自动拆箱是自动执行的。
具体如下:
执行Integer a = 99;时
Integer a = Integer.valueOf(99);
执行int b = a;时,
int b = total.intValue();
1.源码
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
当传进去参数时,首先判断i的大小,如果i小于-128或大于等于128时,就创建一个Integer对象,否则执行SMALL_VALUES[i+128]
2.SMALL_VALUES[i+128]
private static final Integer[] SMALL_VALUES = new Integer[256]
?它是静态的Integer数组对象,因为是静态,所以再创建类的时候就存在它了,所以无论传入传出的数值是否小于-128或大于等于128,valueof函数返回的都是一个Integer对象
?SMALL_VALUES数组是系统本身就创建好的,如果i<128 && i>=-128会根据i的值返回已经创建好的指定的对象
public int intValue() {
return value;
}
直接返回value值
Integer类型
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); //true
System.out.println(i3==i4); //false
}
}
因为i1和i2(-128,128],所以他们会取到SMALL_VALUES数组里面的同一个对象SMALL_VALUES[228],他们引用同一个对象,所以肯定相等
i3和i4执行valueof函数,它们的值大于128,所以会分别new一个新的对象,所以肯定不相等
System.out.println(i1==i2)里判断的是地址值,因为他们已经成为了引用变量。
Double类型
如果将i1,i2,i3,i4换成Double,则i1==i2也为false
public class Main {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2); //false
System.out.println(i3==i4); //false
}
}
因为SMALL_VALUES数组只有256个值,这是固定的,所以小数在里面没有位置,如果算上小数,那么SMALL_VALUES数组就会有无限多个,这个数组没有意义了。
Boolean类型
public class Main {
public static void main(String[] args) {
Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true
}
}
valueOf函数
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
它并没有创建对象,内部提前创建好两个对象,因为boolean只有两种类型,避免重复