Java 中的数据类型主要分为两大类:基本数据类型(Primitive Types)和引用数据类型(Reference Types)。这两者在内存存储、默认值以及使用方式上有着本质的区别。
一、 基本数据类型
基本数据类型是 Java 语言内置的最底层类型,它们直接存储具体的数值,存储在栈内存中,访问效率极高。共有 8 种,可细分为四类:
| 类别 | 类型 | 占用字节 | 取值范围 / 说明 | 默认值 |
|---|---|---|---|---|
| 整数型 | byte | 1 | -128 ~ 127 | 0 |
short | 2 | -32,768 ~ 32,767 | 0 | |
int | 4 | 约 ±21亿 (最常用) | 0 | |
long | 8 | 极大范围,赋值需加后缀L | 0L | |
| 浮点型 | float | 4 | 单精度,赋值需加后缀F | 0.0f |
double | 8 | 双精度 (默认浮点类型) | 0.0d | |
| 字符型 | char | 2 | 存储单个 Unicode 字符,用单引号'A' | ‘\u0000’ |
| 布尔型 | boolean | 不确定* | 只有true和false两个值 | false |
注:JVM 规范未明确规定 boolean 的具体大小,在数组中通常占 1 字节,作为单独变量时可能占 4 字节(取决于 JVM 实现)。
二、 引用数据类型
除了上述 8 种基本类型外,Java 中所有的其他类型都属于引用数据类型。它们在栈中只存储一个指向堆内存中对象的“地址(引用)”,实际数据存放在堆中。主要包括:
- 类(Class):包括 JDK 提供的核心类(如
String、Integer、Date、ArrayList等)以及开发者自定义的类。 - 接口(Interface):如
List、Map、Runnable等,变量声明为接口类型时,实际指向的是实现了该接口的对象。 - 数组(Array):无论是基本类型数组(如
int[])还是对象数组(如String[]),数组本身都是引用类型。 - 枚举(Enum):用于定义一组固定的常量集合,本质上也是特殊的类。
- 注解(Annotation):一种特殊的接口类型,用于为代码提供元数据信息。
三、 核心区别与注意事项
- 内存与性能:基本类型直接在栈上分配,无需垃圾回收,性能最优;引用类型需要在堆上创建对象,有 GC 开销。
- 包装类(Wrapper Class):每种基本类型都有对应的引用类型包装类(如
int→Integer,char→Character)。在集合框架(如List<Integer>)中必须使用包装类。Java 5+ 引入了自动装箱/拆箱机制,但需注意空指针风险和性能损耗。 - 传参方式:基本类型方法传参是值传递(修改不影响原变量);引用类型传参传递的是引用的副本(可通过该引用修改对象内部状态,但无法改变原引用指向的对象)。
- 浮点精度陷阱:
float和double存在精度丢失问题,在涉及金融货币计算时,严禁直接使用浮点型,必须使用BigDecimal类。