HOWTO · Java

Java でオブジェクトを出力する

この記事では、Java でオブジェクトを出力しようとしています。

このチュートリアルでは、Java でオブジェクトを出力する方法を紹介し、トピックを理解するためのサンプルコードをいくつか示します。

オブジェクトはクラスのインスタンスであり、それを使用してクラスのプロパティとメソッドにアクセスできます。ただし、System.out.println() メソッドを使用してオブジェクトを出力しようとすると、期待どおりの出力が得られない場合があります。オブジェクトのプロパティを出力してデバッグし、すべてが正常に機能していることを確認することがよくあります。このチュートリアルでは、Java でオブジェクトのプロパティを出力する方法を学習します。

オブジェクト出力を理解する

オブジェクトについて

  • オブジェクトを出力するとどうなるかを理解してみましょう。System.out.print()メソッドを呼び出すと、Object クラスの toString() メソッドが呼び出されます。
  • ご存知のように、Java のすべてのクラスは Object クラスを拡張します。したがって、toString() メソッドは、任意のクラスの任意のインスタンスに適用できます。
  • このメソッドは、オブジェクトのクラス名とハッシュコードで構成される文字列を返します。これら 2つは@記号で接続されています。

Java でオブジェクトを出力する

新しいクラスを作成して、そのオブジェクトを出力してみましょう。

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    System.out.println(s1);
    System.out.println(s2);
  }
}

出力:

Student@7a81197d
Student@5ca881b5

出力の最初の部分はクラス名(この場合は Student)を示し、2 番目の部分はオブジェクトの一意のハッシュコードを示します。上記のコードを実行するたびに、異なるハッシュコードを取得します。

配列オブジェクト

配列も Java のオブジェクトであり、配列をコンソールに出力しようとしてもその要素を取得しません。次のコードを実行して、その出力を確認してみましょう。

public class Demo {
  public static void main(String[] args) {
    int[] integerArr = {5, 10, 15};
    double[] doubleArr = {5.0, 10.0, 15.0};
    char[] charArr = {'A', 'B', 'C'};
    String[] stringArr = {"Justin", "Jessica"};
    int[][] twoDimArray = {{1, 2, 3}, {4, 5, 6}};
    System.out.println("Integer Array:" + integerArr);
    System.out.println("Double Array:" + doubleArr);
    System.out.println("Char Array:" + charArr);
    System.out.println("String Array:" + stringArr);
    System.out.println("2D Array:" + twoDimArray);
  }
}

出力:

Integer Array:[I@36baf30c
Double Array:[D@7a81197d
Char Array:[C@5ca881b5
String Array:[Ljava.lang.String;@24d46ca6
2D Array:[[I@4517d9a3
  • 角括弧は配列の寸法を示します。1 次元配列の場合、単一の開き角括弧が出力されます。2 次元配列の場合、2つのブラケットがあります。
  • 角かっこの後の次の文字は、配列に格納されているものを示します。整数配列の場合、I が出力されます。char 配列の場合、文字 C が出力されます。
  • 文字列配列の L は、配列にクラスのオブジェクトが含まれていることを示します。このような場合、クラスの名前が次に出力されます(この場合は java.lang.String)。
  • @記号の後に、オブジェクトのハッシュコードが出力されます。

オブジェクトを出力するには

オブジェクトとそのプロパティを別の形式で出力する場合は、クラスの toString() メソッドをオーバーライドする必要があります。このメソッドは文字列を返す必要があります。Student クラスでこのメソッドをオーバーライドして、プロセスを理解しましょう。

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}

これで、このクラスのオブジェクトを出力するときに、学生の名前、登録番号、および GPA を表示できます。

public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    System.out.print(s1);
  }
}

出力:

Justin 101 8.81

配列オブジェクトを出力する

配列に存在する要素を表示するには、Arrays.toString() メソッドを使用する必要があります。ユーザー定義クラスオブジェクトの配列がある場合、ユーザー定義クラスにもオーバーライドされた toString() メソッドが必要であることに注意してください。これにより、クラスプロパティが正しく出力されるようになります。

import java.util.Arrays;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);

    // Creating Arrays
    Student[] studentArr = {s1, s2, s3};
    int[] intArr = {5, 10, 15};
    double[] doubleArr = {5.0, 10.0, 15.0};
    String[] stringArr = {"Justin", "Jessica"};

    System.out.println("Student Array: " + Arrays.toString(studentArr));
    System.out.println("Intger Array: " + Arrays.toString(intArr));
    System.out.println("Double Array: " + Arrays.toString(doubleArr));
    System.out.println("String Array: " + Arrays.toString(stringArr));
  }
}

出力:

Student Array: [Justin 101 8.81, Jessica 102 9.11, Simon 103 7.02]
Intger Array: [5, 10, 15]
Double Array: [5.0, 10.0, 15.0]
String Array: [Justin, Jessica]

多次元配列オブジェクトの出力

多次元配列の場合、toString() メソッドの代わりに deepToString() メソッドを使用して、コンソールに目的の出力を取得します。

import java.util.Arrays;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;

  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);
    Student s4 = new Student("Harry", 104, 8.0);
    Student[][] twoDimStudentArr = {{s1, s2}, {s3, s4}};
    System.out.println("Using toString(): " + Arrays.toString(twoDimStudentArr));
    System.out.println("Using deepToString(): " + Arrays.deepToString(twoDimStudentArr));
  }
}

出力:

Using toString(): [[LStudent;@7a81197d, [LStudent;@5ca881b5]
Using deepToString(): [[Justin 101 8.81, Jessica 102 9.11], [Simon 103 7.02, Harry 104 8.0]]

Java でコレクションオブジェクトを出力する

リストセットMap などのコレクションには、Arrays.toString() などのメソッドを追加する必要はありません。クラスの toString() メソッドを適切にオーバーライドした場合、コレクションを出力するだけで目的の出力が得られます。

import java.util.ArrayList;
import java.util.HashSet;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);

    // Creating an ArrayList
    ArrayList<Student> studentList = new ArrayList<>();
    studentList.add(s1);
    studentList.add(s2);
    studentList.add(s3);
    // Creating a Set
    HashSet<Student> studentSet = new HashSet<>();
    studentSet.add(s1);
    studentSet.add(s2);
    studentSet.add(s3);
    System.out.println("Student List: " + studentList);
    System.out.println("Student Set: " + studentSet);
  }
}

出力:

Student List: [Justin 101 8.81, Jessica 102 9.11, Simon 103 7.02]
Student Set: [Simon 103 7.02, Justin 101 8.81, Jessica 102 9.11]

Apache Commons ライブラリの使用

Apache Commons ライブラリを使用している場合は、Apache Commons ライブラリの ToStringBuilder クラスを使用して、さまざまな方法でオブジェクトをフォーマットします。このクラスの reflectionToString() メソッドを使用できます。

このメソッドを使用して、オブジェクトクラスとハッシュコード、およびプロパティに設定された値を簡単に出力できます。

import org.apache.commons.lang3.builder.ToStringBuilder;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this);
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s = new Student("Justin", 101, 8.81);
    System.out.print(s);
  }
}

出力:

Student@25f38edc[gpa=8.81,regNo=101,studentName=Justin]

ハッシュコードを省略したい場合は、SHORT_PREFIX_STYLE 定数を使用できます。以下の例を参照してください。

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;

  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s = new Student("Justin", 101, 8.81);
    System.out.print(s);
  }
}

出力:

Student[gpa=8.81,regNo=101,studentName=Justin]

クラスにネストされたオブジェクトが含まれている場合は、RecursiveToStringStyle() メソッドを使用してオブジェクトを出力できます。

@Override
public String toString() {
  return ToStringBuilder.reflectionToString(this, new RecursiveToStringStyle());
}

まとめ

Object クラスは、Java のすべてのクラスのスーパークラスです。オブジェクトの出力時に呼び出される toString() メソッドは、Object クラスに実装されています。ただし、この実装では、ユーザー定義のクラスプロパティに関する情報は提供されません。これらのプロパティを適切に表示するには、クラスの toString() メソッドをオーバーライドする必要があります。配列の場合、toString() メソッドまたは deepToString() を直接使用できます。