Java中的基础数据类型及其包装类

目录

一、基础数据类型

1.介绍

2.存储方式

二 、包装类

1.介绍

2.自动装箱和拆箱机制

​​3. 自动装箱和拆箱的缓存机制

3.1 Integer 缓存池(-128 ~ 127)

3.2 其他包装类的缓存​​


一、基础数据类型

1.介绍

       在 Java 中,​​基础数据类型(Primitive Data Types)​​ 是语言内置的基本数据类型,它们不是对象,而是直接存储值的数据类型。Java 的基础数据类型共有 ​​8 种​​,分为 ​​4 类​​:​​整数类型​​、​​浮点类型​​、​​字符类型​​ 和 ​​布尔类型​​。

类别 数据类型 位数(bits) 字节(bytes) 取值范围 默认值
​整数型​ byte 8 1 -128 ~ 127 0
short 16 2 -32,768 ~ 32,767 0
int 32 4 -2³¹ ~ 2³¹-1(约 -2.1e9 ~ 2.1e9) 0
long 64 8 -2⁶³ ~ 2⁶³-1(约 -9.2e18 ~ 9.2e18) 0L
​浮点型​ float 32 4 ±1.4e-45 ~ ±3.4e38(约 6-7 位有效数字) 0.0f
double 64 8 ±4.9e-324 ~ ±1.8e308(约 15 位有效数字) 0.0d
​字符型​ char 16 2 '\u0000'(0) ~ '\uffff'(65,535) '\u0000'
​布尔型​ boolean 1(未明确定义) - true 或 false false

注意​​:

  • boolean 的大小​​:Java 规范没有明确规定 boolean 占用多少位,但 JVM 通常用 ​​1 bit​​ 或 ​​1 byte​​ 存储。

  • ​默认值​​:在类成员变量中,基础数据类型会被自动初始化为默认值(如 int 默认 0boolean 默认 false),但局部变量必须手动初始化,局部变量的生命周期仅限于方法内部,JVM ​​不会自动初始化​​它们例如:

    public class Test {
        public static void main(String[] args) {
            int i;                 // 局部变量,没有默认值
            System.out.println(i); // 编译错误!
        }
    }
    
    public class Test {
        int i;                          // 成员变量,默认值是 0
    
        public static void main(String[] args) {
            Test test = new Test();
            System.out.println(test.i); // 输出 0(默认值)
        }
    }

    2.存储方式

         基础数据类型(Primitive Data Types)​​ 的存储方式与对象不同,它们直接存储 ​​值​​,而不是引用(不像对象那样存储在堆内存)。它们的存储方式主要取决于 ​​变量的作用域​​(局部变量 vs. 成员变量),以及 ​​JVM 的内存管理机制​​(栈内存 vs. 堆内存)。

变量类型 存储位置 存储方式
​局部变量(方法内部定义的变量)​ ​栈内存(Stack)​ 直接存储值
​成员变量(类的字段)​ ​堆内存(Heap)​​(因为对象本身在堆中) 存储在对象内部
public class Test {
    public static void main(String[] args) {
        int i = 10;  // 局部变量,存储在栈内存
        double d = 3.14;  // 局部变量,存储在栈内存
    }
}

​存储方式​​:

  • id直接存储在栈帧(Stack Frame)​中,方法执行结束后,栈帧被销毁,变量也随之消失。

public class Person {
    int age;        // 成员变量,存储在堆内存
    double height;  // 成员变量,存储在堆内存
}

public class Test {
    public static void main(String[] args) {
        Person p = new Person();      // 对象存储在堆内存
        p.age = 25;                   // 成员变量 age 存储在堆内存中的 Person 对象里
        p.height = 1.75;              // 成员变量 height 存储在堆内存中的 Person 对象里
    }
}

存储方式​​:

  • Person 对象存储在 ​​堆内存​​,而 age 和 height 作为成员变量,直接存储在 Person 对象内部。

二 、包装类

1.介绍

         包装类(Wrapper Classes)​​ 的主要作用是将​​基本数据类型(Primitive Types)​​转换为​​对象(Reference Types)。

基础数据类型 包装类 说明
byte Byte 8位有符号整数
short Short 16位有符号整数
int Integer 32位有符号整数
long Long 64位有符号整数
float Float 32位单精度浮点数
double Double 64位双精度浮点数
char Character 16位Unicode字符
boolean Boolean 布尔值(true/false

为什么要使用包装类? 

场景 基本数据类型 包装类 原因
​集合存储​ ❌ 不能存储 ✅ 可以存储 集合只能存对象
​泛型​ ❌ 不能作为类型参数 ✅ 可以作为类型参数 泛型要求引用类型
null 值​ ❌ 不能为 null ✅ 可以为 null 表示缺失值
​方法调用​ ❌ 无方法 ✅ 提供实用方法 如 parseInt()
​反射/序列化​ ❌ 不支持 ✅ 支持 反射只能操作对象
​API 兼容性​ ❌ 部分 API 不支持 ✅ 大多数 API 支持 如 JDBC、Date
​代码简洁性​ ❌ 手动转换 ✅ 自动装箱/拆箱 减少样板代码

何时使用基本数据类型?​

  • ​性能敏感​​的场景(如大量计算、循环),优先使用 intdouble 等基本数据类型,避免装箱/拆箱开销。

  • ​不需要 null 值​​的场景,直接用基本数据类型更高效。

​何时使用包装类?​

  • ​集合、泛型、反射、API 调用​​等必须使用对象的场景。

  • ​需要 null 值​​表示缺失数据的场景。

2.自动装箱和拆箱机制

        自动装箱(Autoboxing)​​ 和 ​​自动拆箱(Unboxing)​​ 是 Java 5(JDK 1.5)引入的一项重要特性,它允许 ​​基本数据类型(Primitive Types)​​ 和 ​​对应的包装类(Wrapper Classes)​​ 之间 ​​自动转换​​,使得开发者可以更便捷地在两者之间切换,而无需手动编写转换代码。 

  • 自动装箱​​ 是指 ​​Java 自动将基本数据类型转换为对应的包装类对象​​ 的过程
int num = 42;
// 显式装箱
Integer integerObj = Integer.valueOf(num); 
// 自动装箱(Java 5+):
Integer autoBoxed = num; // 编译器自动转换为 Integer.valueOf(num)
  •  自动拆箱​​ 是指 ​​Java 自动将包装类对象转换为对应的基本数据类型​​ 的过程。
Integer integerObj = 42;
// 显式拆箱
int num = integerObj.intValue(); 
// 自动拆箱(Java 5+):
int autoUnboxed = integerObj; // 编译器自动转换为 integerObj.intValue()

​3. 自动装箱和拆箱的缓存机制

        Java 对部分包装类(如 IntegerByteShortLongCharacter)提供了 ​​缓存池​​,用于存储 ​​常用范围内的对象​​,避免频繁创建新对象,提高性能。

3.1 Integer 缓存池(-128 ~ 127)

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true(因为 127 在缓存池内,a 和 b 是同一个对象)

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false(128 超出缓存池,新建两个对象)
  • Integer.valueOf() 方法会优先从缓存池(-128 ~ 127)中获取对象,如果存在则直接返回,否则新建对象。

正确写法:

Integer c = 128;
Integer d = 128;
System.out.println(c.equals(d));  // true(比较值)
// 或
System.out.println(c.intValue() == d.intValue());  // true(拆箱后比较值)

3.2 其他包装类的缓存​

包装类 缓存范围
Byte -128 ~ 127(全部缓存)
Short -128 ~ 127
Long -128 ~ 127
Character 0 ~ 127
Boolean TRUE 和 FALSE(单例)

最佳实践​:

✅ ​​优先使用基本数据类型​​(如 intdouble),避免不必要的自动装箱/拆箱。
✅ ​​在循环、高并发场景​​ 避免使用包装类,防止性能下降。
✅ ​​注意 NullPointerException​,避免对 null 包装类进行拆箱。
✅ ​​比较包装类时用 equals()​,而不是 ==(除非确定在缓存池范围内)。

 

你可能感兴趣的:(JAVA学习笔记,java,开发语言,后端)