最近在读《深入理解java核心技术》 , 对于里面比较重要的知识点做一个记录!
众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为每个基本数据类型引入一个对应的类,称为包装类!
byte -- Byte boolean -- Boolean short -- Short char -- Character
int -- Integer long -- Long float -- Float double -- Double
为什么需要包装类?
因为java是面向对象的语言,很多地方需要使用对象而不是基本数据类型 。比如,在集合类中,无法将int,double放进去,因为集合容器要求的元素是object类型 。
装箱:把基本数据类型转换成包装类的过程
拆箱:把包装类换成基本数据类型的过程
自动拆箱:将基本数据类型自动转换成对应的包装类
自动装箱:将包装类自动转换成对应的基本数据类型
自动拆箱与自动装箱的原理:
public static void main(String[] args){
Integer integer = 1;//装箱
int i = integer;//拆箱
}
自动装箱都是通过包装类的valueOf()方法实现的,自动拆箱都是通过包装类对象的xxxvalue()方法实现的 。
在那些场景下,java会自动拆装箱?
场景一:将基本数据类型放入集合类
把基本数据类型放入集合类
import java.util.ArrayList;import java.util.List;public class demo2 {public static void main(String[] args){List<Integer> list = new ArrayList<>();for(int i = 0;i < 10 ; i++){list.add(i);}System.out.println(list);}}
![Java核心技术阅读笔记 java中的自动拆装箱与缓存](http://img.zhejianglong.com/231018/05131I611-0.png)
文章插图
场景二:包装类和基本类型的大小比较
包装类与基本数据类型进行比较运算,是先将包装类拆箱成基本数据类型,然后再进行比较
场景三:包装类的运算
两个包装类会被自动拆箱成基本类型进行计算
场景四:自动拆装箱与缓存
public class demo1 {public static void main(String[] args){Integer integer1 = 22;Integer integer2 = 22;if(integer1 == integer2){System.out.println("integer1 == integer2");}else{System.out.println("integer1 != integer2");}Integer integer3 = 300;Integer integer4 = 300;if(integer3.equals(integer4)){System.out.println("integer3 == integer4");}else{System.out.println("integer3 != integer4");}}}在java中==表示对象引用,而equals表示比较的值
所以上述结果都为true , 如果第二个改为==结果就为false,原因是和Integer中的缓存机制有关,当需要进行自动装箱时 , 如果数字在-128-127之间,则会直接使用缓存中的对象,而不是重新创建一个对象 。
【Java核心技术阅读笔记 java中的自动拆装箱与缓存】
推荐阅读
- 【Java】 DirectByteBuffer堆外内存回收
- Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?
- vue2.x核心源码深入浅出,我还是去看源码了
- Playwright+Java 微软出品自动化神器Playwright系列(四)之浏览器操作
- JavaWeb505错误,IDEA版问题解决
- JavaScript之无题之让人烦躁的模块化
- 2022.9.30 Java第四次课后总结
- 【Java8新特性】- Lambda表达式
- 【Java8新特性】- 接口中默认方法修饰为普通方法
- 浅谈 Golang 插件机制