[Ljava.lang.Object;?
1. 概要
このチュートリアルでは、 [Ljava.lang.Object の意味と、オブジェクトの適切な値にアクセスする方法を学習します。
2. Javaオブジェクトクラス
Javaでは、オブジェクトから直接値を出力する場合、最初に試すことができるのは、そのtoStringメソッドを呼び出すことです。
Object[] arrayOfObjects = { "John", 2, true };
assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));
テストを実行すると成功しますが、通常、あまり有用な結果ではありません。
実行したいのは、配列内の値を出力することです。 代わりに、 Object.class に実装されているように、[Ljava.lang.Object。 クラスの名前があります。 :
getClass().getName() + '@' + Integer.toHexString(hashCode())
オブジェクトから直接クラス名を取得すると、JVMから内部名とその型が取得されます。そのため、[やL のような余分な文字があり、これらはそれぞれArrayタイプとClassNameタイプ。
3. 意味のある値の印刷
結果を正しく出力できるようにするために、java.utilパッケージのいくつかのクラスを使用できます。
3.1. アレイ
たとえば、 Arrays クラスの2つのメソッドを使用して、変換を処理できます。
1次元配列では、toStringメソッドを使用できます。
Object[] arrayOfObjects = { "John", 2, true };
assertEquals(Arrays.toString(arrayOfObjects), "[John, 2, true]");
より深い配列には、deepToStringメソッドがあります。
Object[] innerArray = { "We", "Are", "Inside" };
Object[] arrayOfObjects = { "John", 2, innerArray };
assertEquals(Arrays.deepToString(arrayOfObjects), "[John, 2, [We, Are, Inside]]");
3.2. ストリーミング
JDK 8の重要な新機能の1つは、要素のシーケンスを処理するためのクラスを含むJavaストリームの導入です。
Object[] arrayOfObjects = { "John", 2, true };
List<String> listOfString = Stream.of(arrayOfObjects)
.map(Object::toString)
.collect(Collectors.toList());
assertEquals(listOfString.toString(), "[John, 2, true]");
まず、ヘルパーメソッドを使用してストリームを作成しました
4. 結論
このチュートリアルでは、配列から意味のある情報を出力し、デフォルトの[Ljava.lang.Object;。を回避する方法を見てきました。
この記事のソースコードは、GitHubでいつでも見つけることができます。