[解決済み] SomeType@2f92e0f4」を取得せずにJavaオブジェクトを印刷するにはどうすればよいですか?
質問
以下のように定義されたクラスがあります。
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
からのアノテーション プロジェクトLombok
オブジェクトのグループを印刷する
ということで、素敵な
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()
で説明したとおりです。
関連
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] Javaで文字列を分割する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)