上一篇
Java中没有结构体类型,可通过类(定义公共字段)或记录类(Java 14+)实现类似功能,记录类提供简洁语法自动生成字段、构造方法和访问器,适用于纯数据载体场景。
在Java中,虽然没有直接的“结构体”(struct)类型(这是C/C++的特性),但开发者可以通过两种主流方式实现类似功能:类(class) 和 记录类(record),以下详细解析具体用法和场景:
为什么Java没有结构体?
Java的设计理念强调面向对象编程(OOP),所有自定义数据结构均通过类实现,结构体的核心需求(轻量级数据容器)在Java中可通过以下方案替代:
| 方案 | 适用场景 | 版本要求 |
|---|---|---|
| 类(class) | 需封装数据+行为逻辑 | Java 1.0+ |
| 记录类(record) | 纯数据载体(不可变) | Java 16+ |
使用类(class)模拟结构体
通过定义包含字段和构造方法的类,手动实现数据封装:

// 示例:用类模拟"点坐标"结构体
public class Point {
public int x; // 公开字段(类似结构体)
public int y;
// 构造方法初始化数据
public Point(int x, int y) {
this.x = x;
this.y = y;
}
// 可选:添加方法(如计算距离)
public double distanceToOrigin() {
return Math.sqrt(x * x + y * y);
}
}
// 使用示例
Point p = new Point(3, 4);
System.out.println("坐标: (" + p.x + ", " + p.y + ")");
优点:
- 支持添加方法实现业务逻辑
- 兼容所有Java版本
缺点: - 需手动编写构造方法、getter/setter(若需封装)
使用记录类(record)替代结构体(推荐)
Java 14+引入的record是专为不可变数据载体设计的语法糖,自动生成字段、构造方法、equals/hashCode等:

// 定义记录类(等效于结构体)
public record Point(int x, int y) {
// 可选:添加自定义方法
public double distanceToOrigin() {
return Math.sqrt(x * x + y * y);
}
}
// 使用示例
Point p = new Point(3, 4);
System.out.println(p.x()); // 自动生成getter方法(命名:字段名())
System.out.println(p); // 自动输出:Point[x=3, y=4]
核心特性:
- 不可变性:所有字段隐式
final,创建后不能修改 - 自动生成:
- 全字段构造方法
equals()、hashCode()、toString()- getter方法(命名规则:
字段名(),非getXxx())
- 代码简洁:相比普通类减少90%模板代码
选择建议
| 场景 | 推荐方案 |
|---|---|
| 纯数据存储(如DTO、配置项) | record(首选) |
| 需修改字段值 | class(字段设为非final) |
| 需继承或复杂逻辑 | class |
| 兼容Java 13及以下版本 | class |
关键区别总结
| 特性 | 类(class) | 记录类(record) |
|---|---|---|
| 可变性 | 可修改字段 | 不可变(线程安全) |
| 模板代码量 | 需手动编写 | 自动生成 |
| 设计目的 | 通用对象建模 | 纯数据载体 |
| 内存开销 | 略高(每个对象独立) | 更低(不可变优化) |
何时需要结构体?
- 数据传输对象(DTO):API接口参数/返回值
- 临时数据聚合:如返回多个值的工具方法
- 只读配置项:如数据库连接参数
实际开发中,优先选择
record,因其简洁性和安全性更贴近结构体的设计初衷。
引用说明
- Oracle官方Record类文档
- 《Effective Java》第17条:最小化可变性
- Java SE 16 JEP 395:Record特性标准化
通过合理选择class或record,开发者能以符合Java范式的方式高效管理结构化数据,同时兼顾代码可读性和健壮性。

