但是你可能就会有疑问了,如果我就使用一次包装类的话,它也会缓存创建范围内的所有对象,这样的话怎么实现节省内存提升性能呢?当然,包装类的cache缓存机制是针对大程序而言的概念,小程序并不能很好地体现。于是当确定同值对象使用的次数很少时,我们就可以使用构造器来创建包装类对象,因为缓存类只能通过valueOf方法才会生效
你可能又有疑问了,使用自动装箱直接赋值的形式创建包装类对象会不会使用到缓存呢?答案是 会,因为自动装箱底层就是调包装类对应的valueOf方法,那么你是怎么确定的呢?对自动装箱和自动拆箱代码编译生成的字节码文件进行反编译得出下面的内容,根据12和19行得知:自动装箱调用的是valueOf方法,自动拆箱调用的是intValue方法
public class com.example.demo.code.AutoPacking { java.lang.Integer i1; int i2; public com.example.demo.code.AutoPacking(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_1 6: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 9: putfield #3 // Field i1:Ljava/lang/Integer; 12: aload_0 13: new #4 // class java/lang/Integer 16: dup 17: iconst_2 18: invokespecial #5 // Method java/lang/Integer."<init>":(I)V 21: invokevirtual #6 // Method java/lang/Integer.intValue:()I 24: putfield #7 // Field i2:I 27: return }
通过上面的分析,我们就可以很容易的得出上面那段代码的答案了
包装类的缓存范围
数据类型 包装类 缓存范围
整型 Byte、Short、Long、Integer [-128,127]
浮点型 Float、Double 无
字符型 Character [0,127]
布尔型 Boolean true、false