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()
が出力後に改行を追加することです。どちらのメソッドも、異なるデータ型をサポートし、スレッドセーフな方法でコンソールに出力を行います。