1. Integer 的拆箱装箱(配图+举例+编译解析)
2.Integer 的 部分源码解读
3.Integer 的一些使用注意点
4.列着列着不想列了,反正想到啥写啥吧
正文
======
拆箱和装箱
我想想怎么介绍好一些,要不先随便看点图吧。
① 有4个int 类型,值为 10的 小家伙 等待被处理。
② 设计了 专门用于装int 的 箱子 Integer。
然后丢到一个编号为10的箩筐里面, 以后包装完10的小箱子都会丢到编号10箩筐里,
找int 10 的时候,只需要找编码10的箩筐就行,方便。
③ 又来了一个int 类型,值为 3 的 小家伙 ,也是要处理
一样的,Integer箱子装起来,丢到对应箩筐里就好。
④ 陆陆续续地,各种各样值的int小家伙都被安排妥妥的。
⑤ 大大小小的箩筐堆得遍地都是。
于是乎,腾了一个仓库出来,不过存量有限。
箩筐编号 范围在 -128 ~127 ,就丢这个临时仓库里面。
不在这个范围里面的, 就不弄统一的箩筐了,单独包装个箱子,贴一个随机的编码就得了,意思意思
范围内的:
不在范围内的(区别对待哈哈哈哈哈):
⑥ 为什么范围定在 -128 ~ 127 ?
(1字节=8位(bit)
最小值:10000000 (-128)(-2^7)
最大值:01111111(127)(2^7-1) )
整理总结:
需要处理 int 类型的小家伙时, 我们需要找到对应的箩筐。
那么找箩筐就得去临时仓库。
根据什么找呢, 可知道咱们的规矩是 范围 -128 ~ 127 ,int类型的值符合范围的,必定在仓库里会有(指向) 对应的箩筐。
看到这里,一头雾水。 没关系,就是简单留个印象就行。 接着看后面的内容,慢慢会理解起来的。
1. Integer 装箱 , 将一个基本数据 int 类型的值 转换 为对应的引用类型 Integer 的对象 (int -> Integer) :
核心方法 :Integer.valueOf();
手动装箱示例:
int num =1 ;
//手动装箱
Integer numNew01 =Integer.valueOf(num);
//手动装箱
Integer numNew =Integer.valueOf(1);
好家伙,我只是做个示例,编辑工具直接提示,让我去掉没必要的装箱代码:
为什么?
因为在JAVA 5 里 引入了特性 支持自动装箱和自动拆箱 。
行,那咱们继续看自动装箱:
//自动装箱
Integer numNew = 1;
装箱简单初识到此。
我们说事做事讲求证据,没证据说怎么装都行啊?!
ok,我们来看看证据 ,自动装箱的时候做了什么?
public static void main(String[] args) {
//自动装箱
Integer numNew = 1;
}
javap 一看究竟:
行,确实是自动装了,咱们赶场,看拆箱去。
2. Integer拆箱 ,将一个引用类型 Integer 的对象 转换 为对应的 基本数据 int 类型的值 (Integer -> int) :
核心方法 : Integer.intValue();
手动拆箱示例:
Integer numNew = 1;
//手动拆箱
int num = numNew.intValue();
是的,可以手动,但是没必要。因为 自动拆箱在java 5里面引入了。
Integer numNew = 1;
//自动拆箱
int num = numNew;
一看究竟,好的确实是拆了 :
看到这,看客们应该对装、拆箱有了一些认识了,事不宜迟,我们进入大家最喜欢的源码环节:
Integer装箱方法,我们刚刚提到了,通过javap 分析也能知道
就是 Integer.valueOf();
那么我们直接到源码里面搜索 valueOf ,定位到我们需要看的源码部分:
英文水平比较好的看客,看到这个图,其实心里面已经透亮了。
而跟我一样水平的看客应该也是存在的,那么咱们看下中文翻译(关键部分):
如果需要,通常应优先使用此方法。
构造函数{@link#Integer(int)},因为这个方法很可能通过缓存频繁请求的值。
此方法将始终缓存-128到127范围内的值,包含,并且可能缓存此范围之外的其他值。
自1.5
注释简洁明了, 1.5引入; 范围 -128~127 ; 允许配置范围; 优先调用该方法;
结合实例,开始debug,分析源码:
进入断点, 在编译的时候自动装箱,调用了方法**.valueOf() 😗*
这里是说,符合if条件的,那么就 返回 IntegerCache 里面的 cache 值 , cache(缓存),那就是说,符合条件的,从缓存里面拿出来就好。
那么不符合if条件的, 使用new ,那么意思就是单独处理了。
结论:
判断是否在
-128~127
区间内,是则返回相应的对象引用,不是则返回一个新实例化的对象。
if 条件 :
if (i >= IntegerCache.low && i <= IntegerCache.high)
IntegerCache 是什么? 判断范围是 IntegerCache的 low值和high值之间。
IntegerCache 其实就是 存放箩筐的 临时仓库 , 也就是可以理解为缓存池。
还记得我们的临时仓库存放箩筐的规则是什么吗? 箩筐编码必须在 范围 -128~ 127 之间, 也就是 low值和high值之间 。
简单点进去IntegerCache的源码看一眼:
可以看到关于范围值的获取 , 大致说的就是默认是-128~127 , 但是high值也许是通过配置调整过的。
通过
-XX:AutoBoxCacheMax=size
修改 或者 通过java.lang.Integer.IntegerCache.high
设置最大值
这个 IntegerCache 其实在Integer里是 静态内部类。
初始化的时候,就会对范围内的值进行逐个进行处理,放到 Integer cache[] 缓存数组里面 。 也就是说,箩筐、仓库应用的都有。
这么一来,当我们使用的时候,自动装箱,范围内的就是从缓存仓库里面取就完事了,够快。
注意点 一
Integer值的 比较
既然我们都看到这里了, 也注意到了这个范围的概念。
显然看客们心里必然有想法, 就是范围外的值,装箱后, 不在缓存池里。
使用 new , new大家熟悉吧,用了new 意味着 重新编辑了一个箩筐(分配内存)。
直接看代码:
值比较示例 1:
值比较示例2:
使用“==”比较两个包装类引用时,比较的是指向的引用地址。
两个值 都是 13 , 都在范围 -128 ~ 127之间, 使用 == 符合比较, 相同,true 。
两个值 都是 130 , 都不在范围 -128 ~ 127之间, 使用 == 符合比较, 相同,false。
为什么? 刚才看了源码了,
那么既然知道了这个问题, 我们怎么去比较呢?
1. 范围内 可以使用 == , 范围外 先转为int数值再比较。 干脆点,也就是可以理解为,统统都使用 .intValue再比较。
意思就是利用拆包,转化成 int 类型数值比较, 这样 使用 == 符合就非常正确。
2. 是不是觉得上面说的方式好麻烦? 是的,Integer的作者也知道看客们嫌麻烦,所以Integer重写了 equal方法 :
可以看到,里面也是进行了intValue() ,所以我们可以放心使用 equal去进行值比较。
注意点 二
小心 null 导致 NPE异常
因为 Integer 是包装类,那么接收值的时候 存在null的情况。 如果是null,还去使用的话,那么就会出现空指针 NPE异常。
注意点 三
该篇文章是以 Integer为例做的介绍, 千万不要以为 其他包装类 Double 、Float 也是这个逻辑 ,自动装箱拆箱也是这些 缓冲池、范围等等。
不是 ! 不是 ! 不是 !
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1712847473883)]
RabbitMQ面试专题
[外链图片转存中…(img-JaAcnoKp-1712847473883)]
Redis面试专题
[外链图片转存中…(img-nywtPv4f-1712847473884)]
Spring Cloud面试专题
[外链图片转存中…(img-45rQPmIK-1712847473884)]
SpringBoot面试专题
[外链图片转存中…(img-sEVa1sFb-1712847473884)]
zookeeper面试专题
[外链图片转存中…(img-WOqryrFk-1712847473885)]
常见面试算法题汇总专题
[外链图片转存中…(img-pjjdJw1Y-1712847473885)]
计算机网络基础专题
[外链图片转存中…(img-HcHcm3QN-1712847473885)]
设计模式专题
[外链图片转存中…(img-T2fHS7h1-1712847473886)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-FU3sesy0-1712847473886)]