一、什么是拆箱和装箱
1)什么是拆箱
• 拆箱:将包装类类型转换为基本数据类型
• 拆箱调用Integer.intValue方法
2)什么是装箱
• 装箱:将基本数据类型转换为包装类类型
• 装箱调用的Integer.valueOf方法
Integer a = 100; //装箱
int b = a; //拆箱
二、什么是自动装箱
- Java1.5 之前
Integer a = Integer.valueOf(100); //手动装箱
int b = a.intValue(); //手动拆箱
- Java1.5 之后
Integer a = 100; //自动装箱
int b = a; //自动拆箱
缓存取值范围
int、Integer (-128,127)
long、Long(-128,127)
byte、Byte(-128,127)
short、Short(-32768,32767)
char、Character(0,127)
三、直接装箱
double、float:声明、初始化时会自动装箱
boolean:基本类型布尔值是声明时是自动装箱
• 包装类布尔值:声明boolean或者声明Boolean是一样的,没有区别
• 有区别的是:boolean是基本数据类型、Boolean是引用数据类型(包装类类型)
四、知识点归纳
-
int的默认缓存范围值是-128到127之间
-
当变量值大于等于缓存范围值时,此时底层会new Integer(),重新分配内存地址
-
'=='比较的是引用地址
-
堆:用来存储程序中的一些对象,比如你用new关键字创建的对象,它就会被存储在堆内存中,但是这个对象在堆内存中的首地址会存储在栈中。
栈:在jvm中栈用来存储一些对象的引用、局部变量以及计算过程的中间数据,在方法退出后那么这些变量也会被销毁。它的存储比堆快得多,只比CPU里的寄存器慢
-
栈默认内存:1M
五、面试知识点
- ==与equals区别?
- JVM的堆和栈
- 基础数据类型默认缓存值范围
- 装箱、拆箱
六、代码解读
/**
* 当a1= 200时,valueOf()方法会校验值
* 如果值在缓存之内,返回缓存的内存地址
* 如果值在缓存之外,new Integer()重新分配内存地址
*/
Integer a1 = 100;
Integer b1 = 100;
// 所以返回值:true
System.out.println(a1 == b1);
Integer a2 = 200;
Integer b2 = 200;
// 所以返回值:false
System.out.println(a2 == b2);