用源码看Integer的装箱

本文探讨Java中Integer类的装箱与拆箱机制,解释了int与Integer如何互相转换,以及在不同数值范围下,Integer对象的比较为何会得到不同的结果。深入源码,揭示-128至127范围内Integer对象的缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用源码看Integer的装箱

在看Object类时,不知不觉回顾到了之前学的迷迷糊糊的包装类,正好借着最新牛客刷题也遇到了这一块,就简单总结一下。
在这里插入图片描述
为弥补JAVA之前基本数据类型不能作为对象操作,引入了Integer包装类,int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,且int的初始值为0,Integer的初始值为null。
1、先抛一个疑问:Why下图中打印的前三个结果?
在这里插入图片描述
2、基础–从基本数据类型(int)到包装类型(Integer)的过程是装箱、从包装类型到基本数据类型的过程是拆箱。上图标示了装箱和拆箱的两个过程。
解惑:

(1)i == i1:由于i本身是new Integer的方式单独在堆开辟空间,根据Integer.valueOf()查看源码(推荐大家在日常学习中尝试更多得接触源码,深入体会JAVA,会慢慢提高兴趣,利于学习),其内部类IntegerCache中Integercache[]数组做缓存定义好-128到127的数值的对象,返回这个创建好的数组中对应对象。i1=120 在[-128,127],则返回120,i1是从缓存中取出数据的,缓存的地址和i(new Integer)单独开辟空间对应的地址不同,返回false。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2) i1 == i2:i1=120 在[-128,127],所以i1是从缓存中取出数据的。i2=120 在[-128,127],所以i2也是从缓存中取出数据的。所以i1和i2对应的是同一Integr(100)(对象同一个缓存地址),返回true。

(3)i3 == i4 :虽然i3=i4=128>127,但是i3和i4分别是new Integer这种单独开辟堆空间,地址不同,返回false。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值