Java 包装类型和基本类型

基本类型

Java 提供了 8 种基本类型,包括 6 种数字类型(4 个整型,2 个浮点型),1 种字符类型,1 种布尔类型:

Java 包装类型和基本类型_第1张图片

每个基本类型都对应一个包装类型,即 Byte, Short, Integer, Float, Long, Double, Boolean, Character;把基本类型转换成包装类型的过程叫做装箱(boxing),反之叫拆箱(unboxing)。

int 装箱成 Integer:Integer.valueOf();Integer 拆箱成 int:Integer.intValue()

基本类型和包装类型的区别

  1. 包装类型可以为 null,而基本类型不可以。也就是说基本类型无法表示空值,而且基本类型对应的包装类型初始值为 null,而基本类型初始值是有具体值的;
  2. 包装类型可用于泛型,而基本类型不可以。因为泛型在编译时会进行类型擦除,也就是说泛型会被转换成Object 类,而基本类型不可以转成 Object 类,所以不能用于泛型。

    类型擦除(Type Erasure):将泛型类型转换成 Object 类,类型擦除确保没有新类产生,减少了运行时内存的负担。
  3. 基本类型比包装类型更高效。因为包装类型每次使用都要 new 一个对象,所以直接存数值的基本类型比包装类型占用更少内存空间;
  4. 当基本类型要装箱成包装类型时(即调用 valueOf() 方法 或 直接将基本类型赋值给包装类型),如果数据大小在 -128 ~ 127 之间会直接使用缓存池中的对象,而不是 new 一个对象。

    缓存池:即一个静态常量数组。Charater 类的缓存池范围为 [0, 127],Boolean 类的缓存池为 {true, false},Float 类和 Double 类没有缓存池,其他包装类型(Integer, Long, Byte, Short)的缓存池范围都为 [-128, 127]。
    Integer a = new Integer(123);    // new 一个对象
    Integer b = Integer.valueOf(123);    // 直接使用缓存池中的对象
    System.out.println(a == b);    // false
    
    Integer c = 123;    // 直接使用缓存池中的对象
    Integer d = 123;
    System.out.println(c == d);    // true
    System.out.println(a == c);    // false
    System.out.println(b == c);    // true
  5. 基本类型作为局部变量时存放在 Java 虚拟机栈的局部变量表中,作为类的成员变量时存放在 Java 虚拟机的堆中;包装类型为引用类型,引用本身存放在 Java 虚拟机栈中,对象实例存放在堆中。

参考资料:

  1. Java 基本类型 | 菜鸟教程
  2. 基本类型和包装类型的区别

你可能感兴趣的:(java)