[解決済み] なんだこれ。[Ljava.lang.Object;?
質問
を呼び出すと、次のようなメッセージが表示されます。
toString
を呼び出したときに表示されます。オブジェクトの型がこの文字列にエンコードされていることは分かっているのですが、それを読み取る方法が分かりません。
このタイプのエンコーディングは何と呼ばれていますか?
どのように解決するのですか?
[Ljava.lang.Object;
は
Object[].class
は、その
java.lang.Class
の配列のクラスを表す
Object
.
命名規則については
Class.getName()
:
このクラスオブジェクトが配列型ではない参照型を表す場合、Java 言語仕様で規定されているように、クラスのバイナリ名が返されます ( §13.1 ).
このクラスオブジェクトがプリミティブ型を表している場合、または
void
を表している場合、返される名前はプリミティブ型に対応する Java 言語のキーワード、またはvoid
.このクラスオブジェクトが配列のクラスを表す場合、名前の内部形式は、要素のタイプの名前の前に1つ以上の
'['
文字で表されます。 要素タイプ名のエンコーディングは以下の通りです。Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
あなたのものは、そのリストの最後のものです。 以下はその例です。
// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx
の理由は
toString()
メソッドが配列に対して
String
をこの形式で返すのは、配列が
@Override
から継承されたメソッドは
Object
であり、以下のように指定されます。
は
toString
クラスのメソッドObject
は、オブジェクトのインスタンスであるクラスの名前、アットマーク文字 `@' およびオブジェクトのハッシュコードの符号なし16進数表現からなる文字列を返します。つまり、このメソッドは以下の値に等しい文字列を返す。getClass().getName() + '@' + Integer.toHexString(hashCode())
ノート
に依存することはできません。
toString()
は、任意のオブジェクトが上記の仕様に従うことを当てにすることはできません。
@Override
を返すことができるからです。任意のオブジェクトの型を調べるのにより確実な方法は
getClass()
を呼び出すことです (a
final
から継承されたメソッドです。
Object
を継承している)、そして
を反映した
を返します。
Class
オブジェクトに反映させることができます。しかし理想的には、リフレクションが必要ないようにAPIが設計されているべきです (
Effective Java 2nd Edition, Item 53: Prefer interfaces to reflection
).
もっと "役に立つ" で。
toString
配列の場合
java.util.Arrays
が提供する
toString
プリミティブ配列のオーバーロードと
Object[]
. また
deepToString
もあり、これはネストされた配列に使いたいかもしれません。
以下はその例です。
int[] nums = { 1, 2, 3 };
System.out.println(nums);
// [I@xxxxx
System.out.println(Arrays.toString(nums));
// [1, 2, 3]
int[][] table = {
{ 1, },
{ 2, 3, },
{ 4, 5, 6, },
};
System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]
System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]
また
Arrays.equals
と
Arrays.deepEquals
など、配列に関連する多くのユーティリティメソッドの中で、その要素によって配列の等価比較を実行するものです。
関連する質問
- Java Arrays.equals()は、2次元配列の場合、falseを返します。 -- 詳細なカバレッジ
関連
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] Javaでネストされたループから抜け出すには?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] PHP 配列をキーではなく値で削除する
-
[解決済み] この日付形式は何ですか?2011-08-12T20:17:46.384Z
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
Java の switch case 文で必要な定数式の問題の解決法
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
シェルコマンドやスクリプトのJavaコール
-
SocketException java.netの4つの例外解決策。
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Junitのユニットテストエラー
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。