java八种包装类

概述

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,这样使用变量值的时候如果不赋值则会出错,可以有效的识别出来。

你可能感兴趣的:(java八种包装类)