System.out 是 Java 開發者接觸最早的「朋友」,旗下 print()、println()、printf() 三個方法雖然都能把東西印到控制台,但行為差異巨大。本文從原理、語法、格式化佔位符、對齊控制三個維度徹底釐清,並附上可直接複製運行的實戰代碼。
| 方法 | 換行行為 | 格式化能力 | 典型用途 |
|---|---|---|---|
print(x) | 不換行,游標停留在輸出末尾 | 無,直接輸出 toString() 結果 | 提示輸入、同行拼接輸出 |
println(x) | 輸出後自動換行(相當於 print(x + "\n")) | 無 | 行輸出、日誌、除錯列印 |
printf(fmt, args) | 不自動換行,需在格式字串含 %n | 強,C 風格格式化字串 | 報表對齊、數值精度控制、結構化輸出 |
語法:%[flags][width][.precision]conversion
%d 十進制整數 (byte/short/int/long) %o 八進制整數 %x/%X 十六進制整數 (小寫/大寫) %f 十進制浮點數 (預設 6 位小數) %e/%E 科學記號 %g/%G 根據精度自動選 %f 或 %e %a/%A 十六進制浮點數 (精確表達) %s 字串 %c 字元 %b 布林值 %n 平台相關換行符 (Windows \r\n, Linux \n) 強烈建議用 %n 代替 \n %% 輸出字面 % 符號
- 左對齊 (預設右對齊) + 數值強制顯示正負號 0 數值不足寬度時前導補 0 , 數值加千分位分隔符 ( 負數用括號包裹而非減號 空格 正數前加空格,負數前加負號 (對齊用)
%10d:最小寬度 10,不足右對齊補空格%05d:寬度 5,不足前導補 0 → 00042%.2f:保留 2 位小數 → 3.14%10.2f:寬度 10 含小數點,保留 2 位小數public class PrintDemo {
public static void main(String[] args) {
int i = 42;
double d = 3.1415926;
String name = "Java";
// 1. 基本差異
System.out.print("print: 不換行 -> ");
System.out.println("println: 自動換行");
System.out.printf("printf: 格式化 -> i=%d, d=%.2f%n", i, d);
// 2. 精度控制
System.out.printf("預設浮點: %f%n", d); // 3.141593
System.out.printf("兩位小數: %.2f%n", d); // 3.14
System.out.printf("科學記號: %e%n", d); // 3.141593e+00
// 3. 寬度與對齊:產生整齊表格
System.out.println("\n--- 價目表 ---");
System.out.printf("%-10s %8s %10s%n", "商品", "單價", "小計");
System.out.printf("%-10s %8.2f %10.2f%n", "蘋果", 15.5, 15.5 * 2);
System.out.printf("%-10s %8.2f %10.2f%n", "香蕉", 22.0, 22.0 * 3);
System.out.printf("%-10s %8.2f %10.2f%n", "橘子", 18.8, 18.8 * 1.5);
// 4. 旗標組合:千分位、正負號、補零
int big = 1234567;
System.out.printf("%n千分位: %,d%n", big); // 1,234,567
System.out.printf("強制正負: %+d, %+d%n", 42, -42); // +42, -42
System.out.printf("前導補零: %08d%n", 42); // 00000042
// 5. 日期時間格式化 (Java 5+ 支援 %t 系列)
System.out.printf("%n現在時間: %tF %tT%n", System.currentTimeMillis(), System.currentTimeMillis());
// 輸出: 2024-05-20 14:30:45
}
}
print: 不換行 -> println: 自動換行 printf: 格式化 -> i=42, d=3.14 預設浮點: 3.141593 兩位小數: 3.14 科學記號: 3.141593e+00 --- 價目表 --- 商品 單價 小計 蘋果 15.50 31.00 香蕉 22.00 66.00 橘子 18.80 28.20 千分位: 1,234,567 強制正負: +42, -42 前導補零: 00000042 現在時間: 2024-05-20 14:30:45
%d 對應 int/long,傳 double 會拋 IllegalFormatConversionException。MissingFormatArgumentException。print/println 或 StringBuilder。%n,別寫死 \n 或 \r\n。print 適合無插行拼接,println 是行輸出主力,printf 則是格式化報表、對齊、精度控制的利器。掌握 %[flags][width][.precision]conversion 語法,能讓控制台輸出從「能看」變「好看、好用、可解析」。