Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 -128,127 的相应类型的缓存数据,Character
创建了数值在 0,127 范围的缓存数据,Boolean
直接返回 True
or False
。下面让我们来探究源码吧!
可以看到 当我们需要转换的值在 -128>=x<=127 这个区间 会采用堆中的引用 不信看看下面的测试
测试
可以看到 俩个对象在jvm中的内存地址是一样的 从来说明 使用的是缓存数据
跟Integer同样的方式进入
static变量修饰变量:
在内存中只有一份,相同类的不同实例都指向同一份内存。如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float
,Double
并没有实现缓存机制。
true
还是 false
呢?Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是缓存中的对象。而Integer i2 = new Integer(40)
会直接创建新的对象。 因此,答案是false
。你答对了吗?
记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较什么是装箱拆箱