包装类的产生
java是由基本数据类型的,但是基本数据类型和java有一个冲突,java曾说过万物皆对象,但是int,float,char这些基本数据类型并不是对象,因此java决定不用基本数据类型,而是使用包装类
所以java对于每一个数据类型都设计了一个包装类
基本数据类型对应的包装类
包装类有什么用?
包装类的本质是一个类
public class Test {
public static void main(String[] args) {
int a=12;//int是基本数据类型,它只能定义数据在内存当中如何存储
Integer a1=12;//是一个类,其中有很多方法可以使用,a1可以使用equals方法,而a只能使用==做判断
}
}
int a=12;
int是基本数据类型,它只能定义数据在内存当中如何存储
Integer a1=12;
Integer是一个类,其中有很多方法可以使用,a1可以使用equals方法,而a只能使用==做判断
128陷阱(面试经典题)
public class Test {
public static void main(String[] args) {
Integer a=12;
Integer a1=12;//是引用数据类型,是一个类,其中有很多方法可以使用
System.out.println(a==a1);//true
//==比较的是地址
Integer a2=1000;
Integer a3=1000;//是引用数据类型,是一个类,其中有很多方法可以使用
System.out.println(a2==a3);//false
}
}
执行结果
分析程序执行:
定义的参数Integer a=10,通过编译和反编译,我们会发现在编译过程当中,会将Integer a=10编译为Integer.valueOf(10)
Integer.valueOf方法如下
我们发现当定义的数据不在一个区间范围之内时,会返回一个值,超出区间范围,则会开辟一个新的内存空间(这会导致地址值不同)
通过查看源代码,我们可以发现区间值为[-128,127]
区间为一个长度为256(-128~127)的区间,256个数字最终存储cache数组当中
如果超出区间范围,则会新开辟一块内存空间
执行结果
128陷阱产生的原因
在Integer的valueOf()方法当中,我们将数值在-128~127之间的数值都存储在一个cache数组当中,该数组相当于一个缓存,数据-128~127之间直接返回该数据在数组当中的地址值,所以在-128~127之间的数值用==进行比较是相等的 true
而不在这个区间的数,需要新开辟一个内存空间,所以不相等。false
自动拆装箱(经典问题)
Integer a=10;// Integer a = Integer.valueOf(10);自动装箱
int b=a;//int a = b.intValue();自动拆箱
自动装箱
将基本数据类型自动转换为对应的包装类对象的过程。
自动拆箱
将包装类对象自动转换为对应的基本数据类型的过程。
例题
public class Test {
///自动拆装箱
public static void main(String[] args) {
// Integer a=10;// Integer a = Integer.valueOf(10);自动装箱
// int b=a;//int a = b.intValue();自动拆箱
int a=10;
int b=10;
Integer a1=10;
Integer b1=10;
Integer a2=new Integer(10);
Integer b2=new Integer(10);
System.out.println("1.**********");
System.out.println(a==b);//基本数据类型,比较值是否相等
System.out.println("2.**********");
System.out.println(a1==b1);//引用数据类型,比较地址值是否相同,指向数组中的相同数据
System.out.println("3.**********");
System.out.println(a2==b2);//新开辟内存空间,地址值不同
System.out.println("4.**********");
System.out.println(a1==a);//包装类和基本数据类型通过==进行比较,包装类会自动拆箱,比较直是否相同
System.out.println("5.**********");
System.out.println(a1.equals(a));//包装类和基本数据类型通过equals进行比较会自动拆箱
System.out.println("6.**********");
System.out.println(a1==a2);//地址值不同
System.out.println("7.**********");
System.out.println(a==a2);//自动拆箱
}
}
//
1.**********
true a b都是基本数据类型,==比较值是否相等
2.**********
true a1 b1都是引用数据类型,==比较地址值是否相同,指向数组中的相同数据
3.**********
false a2 b2创建时都新开辟内存空间,地址值不同
4.**********
true 包装类和基本数据类型通过==进行比较时,a1会自动拆箱
5.**********
true 包装类和基本数据类型通过equals进行比较时,a1会自动拆箱
6.**********
false 地址值不同
7.**********
true 包装类和基本数据类型通过==进行比较时,a2会自动拆箱