Я получаю это, когда вызываю toString
для объекта, который я получил от вызова функции. Я знаю, что тип объекта закодирован в этой строке, но я не знаю, как его прочитать.
Как называется этот тип кодирования?
[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
, которые выполняют сравнение на равенство массивов по их элементам. .