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

Java print 與 println 區別詳解:換行行為與底層機制

     編輯:Java 相關知識

一句話總結

print() 輸出後光標停留在行尾;println() 輸出後自動換行,光標移至下行行首。

代碼直觀對比

public class PrintDemo {
    public static void main(String[] args) {
        System.out.print("Hello");
        System.out.print("World");
        System.out.println(); // 輸出: HelloWorld (光標在下一行開頭)

        System.out.println("Hello");
        System.out.println("World");
        // 輸出:
        // Hello
        // World
    }
}

輸出結果可視化

代碼控制台輸出光標最終位置
print("A"); print("B");ABB 後(同一行)
println("A"); println("B");A
B
B 後下一行行首
print("A"); println("B");AB下一行行首
println("A"); print("B");A
B
B 後(同一行)

命名由來

  • print = print(打印)
  • println = print + ln (line,行) → 「打印並換行」

底層實現(JDK 源碼視角)

// PrintStream.java 核心片段
public void print(String s) {
    if (s == null) s = "null";
    write(s); // 寫入字節/字符,不加換行符
}

public void println(String s) {
    synchronized (this) {
        print(s);
        newLine(); // 關鍵:調用 newLine() 輸出平台相關換行符
    }
}

private void newLine() {
    try {
        // Windows: \r\n, Linux/macOS: \n
        write(lineSeparator); // lineSeparator = System.getProperty("line.separator")
    } catch (IOException e) {
        setTrouble();
    }
}

關鍵點:println 內部調用 print + newLine(),newLine() 寫入系統屬性 line.separator(Windows \r\n、Unix \n),實現跨平台換行。

性能微觀差異

  • 同步鎖:PrintStream 所有公共方法均 synchronized,println 鎖定範圍包含 print + newLine,理論上極微小增加鎖持有時間。
  • 字符數:println 多輸出 1-2 個換行字符,I/O 開銷可忽略。
  • 實際建議:不要為性能選擇 print/println,根據輸出格式需求選擇。高頻日誌建議用專業日誌框架(Logback/Log4j2)異步輸出。

常見陷阱與最佳實踐

場景錯誤寫法正確寫法說明
拼接輸出多變量print(a); print(b); println(c);System.out.printf("%s%s%s%n", a, b, c);printf/String.format 可控格式,%n 跨平台換行
調試輸出對象println(obj); (輸出 hashcode)System.out.println(obj.toString()); 或重寫 toString()確保輸出有業務含義
高併發日誌直接用 System.out.println用 Logger.info("msg {}", arg)日誌框架支持級別、異步、滾動、結構化

擴展:PrintWriter vs PrintStream

  • PrintStream:字節流,System.out 默認類型,自動刷新(autoFlush 構造器控制),不拋檢查異常。
  • PrintWriter:字符流,可指定編碼,println 行為一致,但 autoFlush 僅在 println/printf/format 時觸發,print 不觸發。

總結

  • print:無換行,適合同行拼接輸出。
  • println:自動換行,適合逐行輸出、日誌、調試。
  • 底層:println = print + newLine(),newLine() 使用系統換行符 line.separator。
  • 生產代碼:調試用 println,業務日誌用 Logger,格式化輸出用 printf/String.format。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved