什么是128陷阱?

文章解释了Java中的128陷阱,涉及包装器类型、自动装箱和自动拆箱的概念。特别指出Integer类的valueOf方法在-128到127范围内使用缓存,导致相同值的int在自动装箱后使用=比较不相等。

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

要了解128陷阱,首先要知道3个基本概念,包装器类型、自动装箱、自动拆箱。

每个基本类型都有对应的包装器类型,包装器类型。

自动装箱是指自动将基本数据类型转换为包装器类型。

自动拆箱是指自动将包装器类型转换为基本数据类型。

下面举个例子

结果是true,true?No,结果如下

这是因为当值在[-128, 127] 之间时,valueOf 方法不会创建新的Integer对象,而是从缓存中获取,这样一来,值相同的int,计算所得的下标是一样的,自然会获取到同一个Integer对象。而超出这个范围就不会从缓存中获取了,每次都new一个新的Integer对象,两个不同的对象的内存地址不同,用==自然会得到false。

下面是valueof的源码

在源码中我们可以发现如果i >= IntegerCache.low && i <= IntegerCache.high时返回一个已存在于指定数组中的的Integer对象,否则返回一个新对象。
因为==比较的是对象的地址,当赋给a或b的值不在这个范围内时比较是两个具有相同值的不同对象,所以结果会不相等。
 

简单来说,在Integet的valueOf()方当中,在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值