Что это: [Ljava.lang.Object;?

Я получаю это, когда вызываю toString для объекта, который я получил от вызова функции. Я знаю, что тип объекта закодирован в этой строке, но я не знаю, как его прочитать.

Как называется этот тип кодирования?

104
задан Lii 24 January 2019 в 12:48
поделиться

1 ответ

[Ljava.lang.Object; - это имя для Object []. Class , java.lang.Class , представляющего класс массива Объект .

Схема именования задокументирована в Class.getName () :

Если этот объект класса представляет ссылочный тип, который не является типом массива, то возвращается двоичное имя класса, как указано согласно Спецификации языка Java ( §13.1 ).

Если этот объект класса представляет примитивный тип или void , то возвращаемое имя является ключевым словом языка Java, соответствующим примитивному типу, или void .

Если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько '[' символов, представляющих глубину вложенности массива . Кодировка имен типов элементов следующая:

 Кодировка типов элементов
логическое Z
байт B
символ C
двойной D
поплавок F
int I
длинный J
короткий S
класс или интерфейс 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 возвращает строку, состоящую из имени класса, для которого объект - это экземпляр, знак at-символа `@ 'и беззнаковое шестнадцатеричное представление хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

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

Примечание : вы не можете полагаться на toString () любого произвольного объекта, чтобы следовать приведенной выше спецификации, поскольку они могут (и обычно делают) @Override это вернуть что-то другое. Более надежный способ проверить тип произвольного объекта - вызвать на нем getClass () (метод final , унаследованный от Object ), а затем ], отражающий на возвращенном объекте Class . В идеале, однако, API должен быть спроектирован таким образом, чтобы в отражении не было необходимости (см. Эффективное 2-е издание Java, Правило 53: Предпочитайте интерфейсы отражению ).


О более «полезном» 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 , которые выполняют сравнение на равенство массивов по их элементам. .

Связанные вопросы

204
ответ дан 24 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: