Перейти к основному содержимому

Что такое [Ljava.lang.Object;?

· 2 мин. чтения

1. Обзор

В этом руководстве мы узнаем, что означает [Ljava.lang.Object, и как получить доступ к правильным значениям объекта.

2. Класс объектов Java

В Java, если мы хотим напечатать значение непосредственно из объекта, первое, что мы можем попробовать, это вызвать его метод toString :

Object[] arrayOfObjects = { "John", 2, true };
assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));

Если мы запустим тест, он будет успешным, но обычно это не очень полезный результат.

Что мы хотим сделать, так это напечатать значения внутри массива. Вместо этого у нас есть [Ljava.lang.Object. Имя класса, реализованное в Object.class :

getClass().getName() + '@' + Integer.toHexString(hashCode())

Когда мы получаем имя класса непосредственно из объекта, мы получаем внутренние имена из JVM с их типами, поэтому у нас есть дополнительные символы, такие как [ и L , они представляют типы Array и ClassName соответственно.

3. Печать значимых значений

Чтобы иметь возможность правильно распечатать результат, мы можем использовать некоторые классы из пакета java.util .

3.1. Массивы

Например, мы можем использовать два метода класса Arrays для преобразования.

С одномерными массивами мы можем использовать метод 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 является введение потоков 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 .