0
0

java.lang.Systemクラスでわかるprint(), println()の違い

Last updated at Posted at 2024-07-12

print, printlnメソッドは、コンソール出力で使用したことがある人も多いと思います。

println()は改行をいれてくれると認識している人も多いと思いますが、その実態はBufferedWriterクラスのnewLine()メソッドを呼出しています。

以下はSystemクラスとPrintStreamクラスのコードです。Systemはクラス、outはフィールド、print(println)はPrintStreamクラスのメソッドです

public final class System {
	...
	...
	
    public static final InputStream in = null;

    public static final PrintStream out = null;
    
    ...
    ...

}
public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable
{
	...
	...
	
    private boolean trouble = false;
    private Formatter formatter;

    private BufferedWriter textOut;
    private OutputStreamWriter charOut;
    
    private void newLine() {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.newLine();
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush)
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

    public void print(boolean b) {
        write(String.valueOf(b));
    }

    public void print(char c) {
        write(String.valueOf(c));
    }

    public void print(int i) {
        write(String.valueOf(i));
    }

    public void print(long l) {
        write(String.valueOf(l));
    }

    public void print(float f) {
        write(String.valueOf(f));
    }

    public void print(double d) {
        write(String.valueOf(d));
    }

    public void print(char s[]) {
        write(s);
    }

    public void print(String s) {
        write(String.valueOf(s));
    }

    public void print(Object obj) {
        write(String.valueOf(obj));
    }

    public void println() {
        newLine();
    }

    public void println(boolean x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(char x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(int x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(long x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(float x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(double x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(char x[]) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
    
    ...
    ...
}

print() メソッド

  • 機能: 指定されたデータをコンソールに出力しますが、行の終わりに改行文字を追加しません。
  • データ型: 異なるデータ型(boolean, char, int, long, float, double, char arrays, String, Objectなど)に対してオーバーロードされています。
  • :
System.out.print("Hello");
System.out.print("world");

を実行すると、

Helloworld

と表示されます。

println() メソッド

  • 機能: 指定されたデータをコンソールに出力した後、自動的に改行を行います。
  • データ型: print()メソッドと同様に異なるデータ型に対してオーバーロードされており、データを文字列に変換してから出力しますが、出力の後にnewLine()メソッドを呼び出して改行します。
  • :
System.out.println("Hello");
System.out.println("world");

を実行すると、

Hello
world

と表示されます。

実装の詳細

  • println()の内部動作: println()メソッドは、内部的にprint()メソッドを呼び出した後にnewLine()メソッドを呼び出しています。newLine()メソッドは、バッファをフラッシュし、出力ストリームに改行を挿入します。
  • 同期処理: print()メソッドとprintln()メソッドは、内部的にsynchronizedブロック内で実行されます。これは、複数のスレッドが同時にこれらのメソッドを呼び出す場合に、出力が正しく同期されるようにするためです。

まとめ

print()println()の主な違いは、println()が出力後に改行を追加することです。どちらのメソッドも、異なるデータ型をサポートし、スレッドセーフな方法でコンソールに出力を行います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0