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

Java 字符串處理與格式化輸出全攻略:String/StringBuilder/StringBuffer 與 Formatter 實戰

     編輯:Java 程式設計入門

字符串處理是 Java 日常開發最高頻操作。本文系統梳理三大字符串類特性、性能差異、線程安全性,並深度講解格式化輸出的多種方案。

三大字符串類核心對比

特性StringStringBuilderStringBuffer
可變性不可變可變可變
線程安全天然安全(不可變)非線程安全同步方法,線程安全
性能拼接產生大量臨時對象單線程最高同步開銷,略低
適用場景少量拼接、常量、鍵值單線程大量拼接多線程共享拼接
JDK 版本1.05.01.0

String 不可變機制與拼接本質


String s = "a" + 2 + "b" + 2.2;
// 編譯器優化為:
String s = new StringBuilder()
    .append("a").append(2).append("b").append(2.2)
    .toString();
// 產生 1 個 StringBuilder + 1 個 String,而非 4 個 String

但循環中拼接仍會產生大量對象:


// 反例:循環中用 + 
String s = "";
for (int i = 0; i < 10000; i++) s += i;  // 10000 個 StringBuilder + 10000 個 String

// 正例:循環外複用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.append(i);
String s = sb.toString();

常用 String 方法速查

  • 長度/判空:length()、isEmpty()
  • 字符訪問:charAt(index)、toCharArray()、getBytes()
  • 比較:equals()、equalsIgnoreCase()、compareTo()、compareToIgnoreCase()
  • 查找:indexOf()、lastIndexOf()、contains()、startsWith()、endsWith()
  • 截取:substring(begin, end)
  • 轉換:toUpperCase()、toLowerCase()、trim()、replace()、replaceAll(regex)
  • 分割:split(regex) → 返回 String[]
  • 靜態工廠:String.valueOf(obj)、String.format()

注意:split 參數是正則表達式,"a.b".split(".") 會按任意字符分割,需用 split("\\.")。

格式化輸出三大方案

1. PrintStream.format/printf(最常用)


System.out.format("%-3d %-5.3f%n", 1, 2.235235);  // 左對齊寬度3、浮點保留3位
System.out.printf("%-3d %-5.3f%n", 1, 2.235235);  // 同樣效果

2. Formatter 類(靈活輸出目標)


// 輸出到控制台
Formatter f = new Formatter(System.out);
f.format("%-3d %-8.2f %-10s%n", 1, 2.235, "touch");

// 輸出到文件
try (Formatter ff = new Formatter(new FileOutputStream("format.txt"))) {
    ff.format("%-3d %-8.2f %-10s%n", 1, 2.235, "touch");
}

// 輸出到字符串
StringBuilder sb = new StringBuilder();
Formatter f3 = new Formatter(sb);
f3.format("(%d %.2f %s)", 1, 2.235, "touch");
String result = sb.toString();  // "(1 2.24 touch)"

3. String.format(靜態工廠,類 C sprintf)


String s = String.format("(%d %.2f %s)", 1, 2.235, "touch");
// 返回格式化字符串,不直接輸出

常用格式化佔位符速查

佔位符含義示例
%d十進制整數%05d → 00042
%f浮點數%.2f → 3.14
%s字符串%-10s → 左對齊寬度10
%x/%X十六進制%02x → 2a
%c字符%c → 'A'
%b布爾值%b → true
%n平台換行符跨平台換行

寬度/精度語法:%[flags][width][.precision]conversion

  • Flags:-左對齊、0補零、+顯示符號、 正數前空格
  • Width:最小字符寬度
  • Precision:浮點小數位 / 字符串最大長度

實用工具:十六進制查看二進制文件


public class HexUtil {
    public static String format(byte[] data) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            if (i % 16 == 0) {
                sb.append(String.format("%05x: ", i));
            }
            sb.append(String.format("%02x ", data[i]));
            if (i % 16 == 15) sb.append('\n');
        }
        return sb.toString();
    }
}

總結建議

  1. 單線程拼接用 StringBuilder,多線程共享用 StringBuffer
  2. 格式化輸出首選 String.format/PrintStream.printf,需輸出到不同目標用 Formatter
  3. 避免循環中 + 拼接,外層複用 StringBuilder
  4. split 記得轉義正則元字符(. $ ^ { } [ ] | ( ) * + ? \)
  5. 大量字符串操作考慮 CharSequence/字節數組,減少對象創建
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved