目录
1.包装类是类,它属于引用数据类型,==在引用数据类型中比较的是地址是否相同
2.在编译阶段,Integer a=100;这句话会调用Integer类下的valueOf()方法
一、什么是包装类
java说万物皆对象,但是基本类型数据的数据又不太符合这一理念,因为基本数据类型不是对象,所以java将基本数据类型进行一个封装,产生了一个新的类,这个类就叫包装类。java对每一个基本数据类型都设计了一个包装类。
二、基本数据类型的包装类
基本数据类型 | 包装类 |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
三、包装类和基本数据类型的区别
包装类是一个类,那么它里面就有很多方法,我们就可以使用这里面的方法
比如分别用int和Integer定义变量
int a=10;
Integer a1=10;
对a变量来说,它只能用==进行判断,但是a1就可以用equals()方法进行判断
四、128陷阱
判断下面程序的输出结果:
public class Test {
public static void main(String[] args) {
Integer a1=100;
Integer a2=100;
System.out.println(a1==a2);
Integer a3=1000;
Integer a4=1000;
System.out.println(a3==a4);
}
}
输出:
原因:
1.包装类是类,它属于引用数据类型,==在引用数据类型中比较的是地址是否相同
2.在编译阶段,Integer a=100;这句话会调用Integer类下的valueOf()方法
最终会被编译成Integer a=Integer.valueOf(100);
3.valueOf()方法
在valueOf()方法中,传进来的参数会进行if判断,如果参数在这个范围(-128~127)内,就直接返回,如果不在,返回的里面有一个new关键字,new关键字是在堆内存中开辟一块新的内存空间
标准答案:
在Integer中的valueOf()方法中,将-128~127之间的数值都存储在一个catch数组中,该数组相当于一个缓存,当我们在-128~127之间进行自动装箱时,就直接返回该值在数组中的地址,所以在-128~127之间的数值用==比较是相等的;而不在这个区间的数,则需要开辟一个内存空间,所以不相等
五、自动装箱、自动拆箱
1.自动装箱
自动装箱指的是基本数据类型转化成当前引用数据类型
Integer a=10;
这句话在编译的时候会被编译成 Integer a=Integer.valueOf(10); 涉及自动装箱
可以把Integer这个类理解成一个箱子,因为它除了变量,还有很多方法,相当于把int类型的值装进Integer,而且Integer a=Integer.valueOf(10); 这句话在编译的时候是自动完成的,所以叫自动装箱
2.自动拆箱
自动拆箱指的是引用数据类型转化成基本数据类型
Integer a=10;
int b=a;//这句话就涉及到自动拆箱
这句话在编译的时候会被编译成 int b=a.intValue(); 涉及自动拆箱
因为int只能去存储值,相当于把值从箱子里拿出来,而且int b=a.intValue(); 这句话在编译的时候是自动完成的,所以叫自动拆箱
六、巩固练习
下列输出是什么
public class Test {
public static void main(String[] args) {
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---"+(a==b));
System.out.println("2---"+(a1==b1));
System.out.println("3---"+(a2==b2));
System.out.println("4---"+(a1==a));
System.out.println("5---"+(a1.equals(a)));
System.out.println("6---"+(a1==a2));
System.out.println("7---"+(a==a2));
}
}
输出
1---true
2---true
3---false
4---true
5---true
6---false
7---true
原因:
1---true
对基本数据类型来说,==进行的是值的判断,所以是true
2---true
从数组当中找数据,10在-128~127之间,对引用数据类型来说,==比较的是地址是否相等,所以是true
3---false
new关键字是在堆内存中开辟新的内存空间
4---true
包装类和基本数据类型用==进行判断的话,进行自动拆箱,自动拆箱之后,a1就成了int
类型的数据,这时候==进行的值的判断,所以是true
5---true
在这个equals()方法中,他先判断传进来的参数是否属于Integer类型,属于的话,就自动拆箱,然后判断值是否相等;不属于的话,就直接false
6---false
a1是在数组中,a2是开辟了一块新的内存空间
7---true
这里存在自动拆箱,然后进行的是值的判断