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でいつでも見つけることができます。