1. ホーム
  2. java

[解決済み] SomeType@2f92e0f4」を取得せずにJavaオブジェクトを印刷するにはどうすればよいですか?

2022-01-29 21:27:46

質問

以下のように定義されたクラスがあります。

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

自分のクラスのインスタンスを印刷しようとした。

System.out.println(myPerson);

が、以下のように出力されました。 com.foo.Person@2f92e0f4 .

の配列を表示しようとすると、同じようなことが起こりました。 Person オブジェクトを作成します。

Person[] people = //...
System.out.println(people); 

と出力されました。 [Lcom.foo.Person;@28a418fc

この出力は何を意味するのでしょうか?どうしたらこの出力を変更して、私の人物の名前を含むようにできますか?また、私のオブジェクトのコレクションを印刷するにはどうすればよいのでしょうか?

<サブ 備考 これは、このテーマに関する標準的なQ&Aを意図しています。

解決方法は?

背景

すべてのJavaオブジェクトには toString() このメソッドは、そのオブジェクトを印刷しようとしたときに呼び出されます。

System.out.println(myObject);  // invokes myObject.toString()

このメソッドは Object クラス (すべての Java オブジェクトのスーパークラス) を使用します。その Object.toString() メソッドが返す文字列は、クラス名と @ シンボルと ハッシュコード のオブジェクトを16進数で表示します。そのためのコードは次のようになる。

// Code of Object.toString()
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

のような結果が得られます。 com.foo.MyType@2f92e0f4 は、したがって、次のように説明することができる。

  • com.foo.MyType - はクラスの名前、つまりクラスは MyType パッケージ内の com.foo .
  • @ - は文字列を結合する
  • 2f92e0f4 オブジェクトのハッシュコード。

配列クラスの名前は少し違って見えますが、これは以下のJavadocsでよく説明されています。 Class.getName() . 例えば [Ljava.lang.String を意味します。

  • [ - は1次元配列で [[ または [[[ など)
  • L - 配列にクラスまたはインターフェイスが含まれる場合
  • java.lang.String - 配列に含まれるオブジェクトの種類

出力のカスタマイズ

を呼び出したときに別のものを表示させるには System.out.println(myObject) を使用する必要があります。 オーバーライド toString() メソッドを自分のクラスで使用することができます。以下は簡単な例です。

public class Person {

  private String name;
  
  // constructors and other methods omitted
  
  @Override
  public String toString() {
    return name;
  }
}

ここで Person ではなく、その名前が表示されます。 com.foo.Person@12345678 .

を念頭に置いてください。 toString() はあくまで オブジェクトが文字列に変換される方法です。一般的に、この出力はオブジェクトを簡潔明瞭に完全に記述する必要があります。より良い toString() に対して、私たちの Person クラスは次のようになります。

@Override
public String toString() {
  return getClass().getSimpleName() + "[name=" + name + "]";
}

と表示されます。 Person[name=Henry] . これはデバッグやテストにとても便利なデータですね。

オブジェクトのある側面だけに焦点を当てたい場合、あるいは多くの奇抜なフォーマットを含む場合は、代わりに別のメソッドを定義するほうがよいでしょう。 String toElegantReport() {...} .


出力の自動生成

多くの IDE を自動生成するサポートがあります。 toString() メソッドで、クラス内のフィールドを元に作成します。のドキュメントを参照してください。 エクリプス IntelliJ といった具合に。

いくつかの有名なJavaライブラリもこの機能を提供しています。いくつかの例を挙げます。


オブジェクトのグループを印刷する

ということで、素敵な toString() を使用します。そのクラスが配列やコレクションに配置されるとどうなるのでしょうか?

配列

オブジェクトの配列がある場合、その配列に対して Arrays.toString() を使えば、配列の中身を簡単に表現することができます。たとえば、次のような配列があるとします。 Person オブジェクトを作成します。

Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));

// Prints: [Fred, Mike]

注:これは 静的 というメソッドがあります。 toString() を Arrays クラスに追加することで、上記で説明したこととは異なることがわかります。

がある場合は 多次元配列 を使用することができます。 Arrays.deepToString() を使えば、同じような出力が得られます。

コレクション

ほとんどのコレクションは、以下の呼び出しに基づいて、きれいな出力を生成します。 .toString() をすべての要素に適用します。

List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));    
System.out.println(people);

// Prints [Alice, Bob]

したがって、リスト要素に適切な toString() で説明したとおりです。