Integer 我能和你交流一下吗?


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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MongDB面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MyBatis面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MySQL面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

zookeeper面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常见面试算法题汇总专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远。不论你是正从事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)]

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值