概述
java中有八种基本类型分别对应八种包装类型,但是包装类里实际存储的值还是使用的基本类型。
例如Interge使用成员变量value记录值 private final int value
;
特点
- 包装类统一继承抽象类Number,并且实现了Comparable接口
- 包装类都是final,而且成员变量都是static final
构造方式
- 通过直接赋值
Integer i=1;
- 构造器
Integer i=new Integer(1);
- 静态工厂valueOf方法
Integer i=Integer.valueOf(1);
自动拆装箱
- JVM自动进行的转换,在编译阶段执行,保证不同的写法在运行时是等价的。
-
Integer i=1;
执行装箱操作,先调用valueOf方法生成对象,然后将变量i执行它 -
int j=i++;
执行拆箱操作,先调用intValue方法拿到值,然后将其+1操作
缓存
除了Float和Double,其余六种包装类自身都包含有内部缓存,使用内部缓存类cache,来初始化缓存。调用valueOf方法时,会先匹配缓存,如果无法命中,则执行new实例。
缓存范围如下:
- Byte 全部被缓存,即[-128,127]
- Short和Long [-128,127]
- Character [0,127]
- Integer [-128,127]
- Boolean TRUE/FALSE
值得注意的是,在执行拆装箱操作时,缓存是有效的,代码如下
//自动装箱,缓存有效
Integer i=127;
Integer j=Integer.valueOf(127);
System.out.println(j==i); //true
//自动装箱,没有匹配缓存
Integer a=Integer.valueOf(128);
Integer b=128;
System.out.println(a==b);//false
效率
- 绝大多数情况区别不大,但尽量避免无意的装拆箱操作。
- 在性能敏感的场景下,处理大量数据的开销,比如几十万个整数,这种时候使用基本类型用来代替包装类是比较合适的,或者使用数组代替List,因为数组类是JVM编译创建的.
hashcode
因为包装类hashCode是基于其自身value值计算的,所以不同方式构造出来的包装类只要其value样,则hashCode也一定相同。
使用场景
- 原始基本类型不使用与集合或者枚举中,所以有一定的局限性
- 在javabean里面最好使用Integer来定义,因为Integer值默认为null,这样使用变量值的时候如果不赋值则会出错,可以有效的识别出来。