在Java中,我们有自动解包,和生成包的功能,而在int转化为Integer时我们会发现程序会将127以上的数值给一个False的结果,在127及以下的数值给一个True的结果。
下面是测试代码:
输出结果为:
查找资料后发现在为Integer类型的变量赋int类型值时,Java会自动将int类型转换为Integer类型,会调用value()方法返回一个Integer类型值,并将其赋值给变量a。这就是int的自动装箱。而在程序每次运行循环时都会触发Integer的自动装箱,而自动装箱会将int转换Integer类型值并返回;我们知道Java中两个new出来的对象因为是不同的两个实例,所以理论上会返回fasle。那么为什么在127以下的数据就会返回true了呢?
为此我又更改了了程序试图测试这个返回ture的范围在哪里:
而这个程序的结果显示在[-128,127]这个区间内返回均为true。再判断认为可能自动装箱在一些情况下并非为new出的新对象,然后查找资料在自动装箱引用的Integer.valueOf()的源码中,注释里就直接说明了-128到127之间的值都是直接从缓存中取出的。
从源码中看出它比较了int i 和IntegerCache.low以及IntegerCache.high的范围,如果在范围则由IntegerCache返回,如果不在,则new一个新对象。
那么为什么由IntegerCache返回就为同一对象了呢?那么再看看IntegerCache的源码:
从源码中可以看出对于-128到127之间的int类型,都是同一个Integer类型对象存储在cache[]中并返回。所以再-128到127的情况下就会返回同一缓存下的内容,为同一对象所以返回为ture。
除此之外还有别的自动装箱和自动拆箱的基本类型,其中有些也利用了缓存:
基本类型 | 缓存范围 |
---|---|
byte | -128~127 |
short | -128~127 |
int | -128~127 |
long | -128~127 |
char | 0~127 |
boolean | ture,false |
float | 无缓存 |
double | 无缓存 |