Java 基本数据类型
Java 是一种强类型语言,这意味着所有变量都必须先声明其类型,然后才能使用,Java 提供了 8 种基本数据类型,它们可以分为四大类:

整数类型
用于表示没有小数部分的数字。
| 数据类型 | 大小(字节) | 范围 | 默认值 | 备注 |
|---|---|---|---|---|
byte |
1 | -128 ~ 127 | 0 |
在处理大型数组时,可以节省内存空间。 |
short |
2 | -32,768 ~ 32,767 | 0 |
较少使用,除非需要明确指定短整型。 |
int |
4 | -2³¹ ~ 2³¹-1 | 0 |
最常用的整数类型。 |
long |
8 | -2⁶³ ~ 2⁶³-1 | 0L |
用于表示非常大的整数,定义时需在数字后加 L 或 l。 |
浮点类型
用于表示带有小数部分的数字(即实数)。
| 数据类型 | 大小(字节) | 范围 | 默认值 | 备注 |
|---|---|---|---|---|
float |
4 | 约 ±3.40282347E+38F | 0f |
单精度浮点数,定义时需在数字后加 F 或 f。 |
double |
8 | 约 ±1.7976931348623157E+308 | 0d |
双精度浮点数,比 float 精度更高,是默认的浮点类型。 |
字符类型
用于表示单个字符。
| 数据类型 | 大小(字节) | 范围 | 默认值 | 备注 |
|---|---|---|---|---|
char |
2 | '\u0000' (0) 到 '\uffff' (65,535) | '\u0000' | 使用单引号 括起来的一个字符,基于 Unicode 编码。 |
布尔类型
用于表示真或假的值。

| 数据类型 | 大小(字节) | 范围 | 默认值 | 备注 |
|---|---|---|---|---|
boolean |
理论上不固定 | true / false |
false |
用于逻辑判断,其大小在 JVM 中没有明确规定,通常认为占用 1 位或 1 字节。 |
包装类
什么是包装类?
Java 的基本数据类型不是对象,它们没有方法,不能作为泛型的类型参数(List<int> 是错误的),也不能在集合(如 ArrayList)中直接使用。
为了弥补这个缺陷,Java 为每一个基本数据类型都提供了一个对应的引用类型,称为包装类,包装类是一个类,它包含了基本类型的数据,并为其提供了许多实用的方法。
包装类与基本数据类型的对应关系
| 基本数据类型 | 包装类 |
|---|---|
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
为什么需要包装类?(核心作用)
包装类的主要作用在于将基本数据类型“对象化”,以便它们能参与到面向对象的编程世界中。
-
支持泛型:集合框架(如
ArrayList,HashMap)不能使用基本数据类型作为泛型参数,必须使用包装类。
(图片来源网络,侵删)// 错误用法 // List<int> list = new ArrayList<>(); // 正确用法 List<Integer> list = new ArrayList<>();
-
提供实用方法:包装类包含了许多静态方法,用于处理数据类型相关的操作。
Integer.parseInt("123"):将字符串"123"转换为int类型123。Double.toHexString(3.14):将double类型转换为其十六进制字符串表示。Character.isDigit('a'):判断字符是否为数字。
-
可以为
null:基本数据类型有默认值(如int的默认值是0),但包装类是对象,可以为null,这在某些场景下非常有用,例如数据库中的某个字段可能没有值,此时用null表示比用0或-1更能体现“无值”的语义。Integer userId; // 可以为 null,表示用户ID未知 int age; // 必须为 0 或其他有效值,不能表示“未知”
-
支持多线程同步:虽然不常用,但作为对象,包装类可以被锁(
synchronized),而基本类型不能。
自动装箱与拆箱
为了方便在基本类型和包装类之间转换,Java 5 引入了自动装箱和自动拆箱机制。
自动装箱
将基本类型自动转换为对应的包装类对象。
// 在 Java 5 之前,需要手动装箱 Integer i1 = new Integer(10); // Java 5 之后,自动装箱 Integer i2 = 10; // JVM 自动执行了 Integer.valueOf(10)
自动拆箱
将包装类对象自动转换为对应的基本类型。
// 在 Java 5 之前,需要手动拆箱 int i3 = i1.intValue(); // Java 5 之后,自动拆箱 int i4 = i2; // JVM 自动执行了 i2.intValue()
使用示例
List<Integer> list = new ArrayList<>(); // 自动装箱:将 int 类型的 20 自动转为 Integer 对象并添加到集合中 list.add(20); // 自动拆箱:从集合中取出 Integer 对象,自动转为 int 类型 int num = list.get(0); System.out.println(num); // 输出 20
自动装箱与拆箱的陷阱
由于自动装箱的存在, 运算符在比较包装类对象时可能会产生意想不到的结果。
陷阱 1: 比较的是对象地址,而不是值
Integer a = 100; Integer b = 100; System.out.println(a == b); // true Integer c = 200; Integer d = 200; System.out.println(c == d); // false
为什么?
为了提高性能和节省内存,Java 对 Integer 对象(-128 到 127)进行了缓存或常量池,当自动装箱一个 int 值在这个范围内时,它会直接从缓存中获取对象,而不是新建一个。a 和 b 实际上指向了同一个对象地址,而 200 超出了这个范围,c 和 d 是两个不同的对象实例。
正确做法: 使用 equals() 方法来比较包装类对象的值。
System.out.println(c.equals(d)); // true
陷阱 2:空指针异常
Integer count = null; int num = count; // 自动拆箱,相当于 count.intValue() // 抛出 NullPointerException,因为 count 是 null,无法调用 intValue() 方法
总结与对比
| 特性 | 基本数据类型 | 包装类 |
|---|---|---|
| 类型 | 非对象(值类型) | 对象(引用类型) |
| 存储位置 | 栈 | 堆 |
| 默认值 | 有(如 int 默认为 0) |
null |
| 功能 | 仅用于存储数据 | 提供丰富的方法,支持泛型,可为 null |
| 性能 | 速度快,内存占用小 | 速度慢,需要额外的对象开销 |
| 使用场景 | 计算密集型场景,需要高性能 | 需要放入集合,需要 null 表示,需要调用方法时 |
| 转换 | 通过自动装箱/拆箱与包装类互转 | 通过自动装箱/拆箱与基本类型互转 |
最佳实践建议:
- 基本类型优先:在不需要对象特性(如
null、泛型、方法)的简单计算中,优先使用基本类型,因为它更高效。 - 包装类在特定场景下使用:当需要使用集合框架、需要将基本类型作为
Object传递、或者需要表示“无值”(null)的概念时,必须使用包装类。
