1. 概述
在 Java 开发中,经常需要将数据以表格形式展示。System.out
提供了多种实现方式,从简单的字符串拼接到高级格式化技术。本文将探索使用 System.out
实现表格输出的几种方法。
2. 使用字符串拼接
最基础的方式是字符串拼接。虽然简单直接,但需要手动调整空格和对齐:
void usingStringConcatenation() {
String[] headers = {"ID", "Name", "Age"};
String[][] data = {
{"1", "James", "24"},
{"2", "Sarah", "27"},
{"3", "Keith", "31"}
};
System.out.println(headers[0] + " " + headers[1] + " " + headers[2]);
for (String[] row : data) {
System.out.println(row[0] + " " + row[1] + " " + row[2]);
}
}
输出结果:
ID Name Age
1 James 24
2 Sarah 27
3 Keith 31
⚠️ 缺陷:这种方法在处理动态数据时非常麻烦,需要手动调整空格才能保持对齐。
3. 使用 printf()
System.out.printf()
提供更灵活的格式化能力。我们可以指定列宽并确保对齐:
void usingPrintf() {
String[] headers = {"ID", "Name", "Age"};
String[][] data = {
{"1", "James", "24"},
{"2", "Sarah", "27"},
{"3", "Keith", "31"}
};
System.out.printf("%-5s %-10s %-5s%n", headers[0], headers[1], headers[2]);
for (String[] row : data) {
System.out.printf("%-5s %-10s %-5s%n", row[0], row[1], row[2]);
}
}
输出结果:
ID Name Age
1 James 24
2 Sarah 27
3 Keith 31
✅ 优势:
%-5s
表示左对齐字符串,宽度为 5 个字符%-10s
表示左对齐字符串,宽度为 10 个字符- 无论数据长度如何,列都能自动对齐
4. 使用 String.format()
当需要将格式化结果存储为字符串而非直接打印时,使用 String.format()
。其语法与 printf()
完全一致:
void usingStringFormat() {
String[] headers = {"ID", "Name", "Age"};
String[][] data = {
{"1", "James", "24"},
{"2", "Sarah", "27"},
{"3", "Keith", "31"}
};
String header = String.format("%-5s %-10s %-5s", headers[0], headers[1], headers[2]);
System.out.println(header);
for (String[] row : data) {
String formattedRow = String.format("%-5s %-10s %-5s", row[0], row[1], row[2]);
System.out.println(formattedRow);
}
}
输出结果与 printf()
示例相同:
ID Name Age
1 James 24
2 Sarah 27
3 Keith 31
✅ 关键区别:String.format()
返回格式化后的字符串,可用于后续处理或日志记录。
5. 使用 StringBuilder
处理动态或大数据量时,使用 StringBuilder
构建表格更高效。它能将整个输出合并为单次打印:
void usingStringBuilder() {
String[] headers = {"ID", "Name", "Age"};
String[][] data = {
{"1", "James", "24"},
{"2", "Sarah", "27"},
{"3", "Keith", "31"}
};
StringBuilder table = new StringBuilder();
table.append(String.format("%-5s %-10s %-5s%n", headers[0], headers[1], headers[2]));
for (String[] row : data) {
table.append(String.format("%-5s %-10s %-5s%n", row[0], row[1], row[2]));
}
System.out.print(table.toString());
}
输出结果:
ID Name Age
1 James 24
2 Sarah 27
3 Keith 31
✅ 适用场景:
- 需要构建复杂输出时
- 性能敏感场景(减少多次字符串拼接的开销)
6. 使用 ASCII Table
第三方库如 ASCII Table 能快速生成美观的 ASCII 表格。首先添加 Maven 依赖:
<dependency>
<groupId>de.vandermeer</groupId>
<artifactId>asciitable</artifactId>
<version>0.3.2</version>
</dependency>
使用示例:
void usingAsciiTable() {
AsciiTable table = new AsciiTable();
table.addRule();
table.addRow("ID", "Name", "Age");
table.addRule();
table.addRow("1", "James", "24");
table.addRow("2", "Sarah", "27");
table.addRow("3", "Keith", "31");
table.addRule();
String renderedTable = table.render();
System.out.println(renderedTable);
}
输出结果:
┌──────────────────────────┬─────────────────────────┬─────────────────────────┐
│ID │Name │Age │
├──────────────────────────┼─────────────────────────┼─────────────────────────┤
│1 │James │24 │
│2 │Sarah │27 │
│3 │Keith │31 │
└──────────────────────────┴─────────────────────────┴─────────────────────────┘
✅ 优势:自动添加边框和分隔线,输出更专业美观。
7. 总结
根据场景选择合适的表格输出方案:
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
字符串拼接 | 简单静态数据 | 无需额外知识 | 维护性差,对齐易错 |
printf() |
直接打印格式化表格 | 简单高效,自动对齐 | 无法复用格式化结果 |
String.format() |
需要存储格式化字符串 | 灵活复用 | 代码稍显冗长 |
StringBuilder |
大数据量/动态表格 | 性能优越 | 手动处理格式 |
ASCII Table 库 | 需要专业美观的表格 | 自动边框对齐 | 需引入外部依赖 |
🔥 简单粗暴选型建议:
- 临时调试:用
printf()
- 需要复用格式:用
String.format()
- 大数据量:用
StringBuilder
- 正式输出:直接上 ASCII Table 库