首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

J2SE 1.5 Tiger 新特性實戰(二):可變長度參數與格式化輸出

     編輯:J2SE

前言

J2SE 1.5 引入可變長度參數 和 Formatter/printf 格式化輸出,極大豐富了方法簽名靈活度與字串格式化能力。本文透過範例展示兩大特性用法與陷阱。

一、 格式化輸出基礎

1. Formatter + StringBuilder

StringBuilder sb = new StringBuilder();
Formatter fmt = new Formatter(sb);
fmt.format("%12.10f", Math.PI); // 寬度12,小數10位
System.out.println(fmt); // 輸出: 3.1415926536

2. 便捷的 printf / String.format

System.out.printf("%12.10f%n", Math.PI); // 直接輸出到標準輸出
String s = String.format("%12.10f", Math.PI); // 取得格式化字串

3. 常用格式化轉換符

轉換符說明範例輸出
%d / %x十進位/十六進位整數42 / 2a
%f / %e定點/科學記號浮點數3.141593 / 3.141593e+00
%s字串 (toString)hello
%c字元A
%b布林值true
%n平台相關換行符\n (Linux) / \r\n (Win)
%%字面 % 符號%

旗標範例:%,d 千分位分隔 (1,234,567)、%05d 零填寬 (00042)、%-10s 左對齊。

二、 可變長度參數 (Varargs)

語法

public static void printf(String format, Object... args) { ... }
// 呼叫
printf("Hello %s, %s!", "World", "Java"); // args 為 Object[] { "World", "Java" }

規則與限制

  • 只能出現在**參數列表最後**。
  • 每個方法**最多一個** varargs 參數。
  • 內部實為陣列,呼叫端可傳陣列、多個引數或零引數。
  • 優先匹配固定參數簽名,再匹配 varargs (重載解析規則)。

三、 綜合範例:自製 printf 模擬

package tigers;

public class FormatPrint {
    public static void main(String[] args) {
        printf("%, %, % and % are my friends!", "BITAN", "HELEN", "KATHY", "SUSAN");
        // 第二次呼叫:4 個佔位符但傳 5 個引數 → 運行時 ArrayIndexOutOfBoundsException
        printf("%, %, %, % and % are my favorites", "A", "B", "C", "D");
    }

    // 簡易 printf:% 佔位符依序替換為 varargs 字串
    public static void printf(String msg, String... strs) {
        int i = 0;
        for (char c : msg.toCharArray()) {
            System.out.print(c == '%' ? strs[i++] : c);
        }
        System.out.println();
    }
}

執行結果

BITAN, HELEN, KATHY and SUSAN are my friends!
A, B, C, D and Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at tigers.FormatPrint.printf(FormatPrint.java:12)
    at tigers.FormatPrint.main(FormatPrint.java:6)

錯誤分析

第二次呼叫格式字串含 **5 個 %**,但只傳 **4 個字串引數**,導致 strs[4] 存取越界。實務中應檢查引數數量或使用 String.format 由 JDK 內建檢查。

四、 進階:Formatter 完整語法

%[argument_index$][flags][width][.precision]conversion
// 範例
System.out.format("%2$d %1$d%n", 10, 20); // 20 10 (引數索引)
System.out.format("%,.2f%n", 1234567.891); // 1,234,567.89 (千分位+2位小數)
System.out.format("%08d%n", 42); // 00000042 (零填寬度8)

五、 總結

  • varargs 讓 API 更彈性,但需注意重載陷阱與空陣列處理。
  • Formatter/printf 提供 C 風格強大格式化,String.format 更適合構建字串。
  • Java 15+ 引入 String.formatted(Object...) 實例方法:"Hello %s".formatted("World"),語法更直觀。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved