Я получаю это, когда я вызываю toString
для объекта, который я получил от вызова функции. Я знаю, что тип объекта закодирован в этой строке, но я не знаю, как его прочитать.
Как называется этот тип кодирования?
Я получаю это, когда я вызываю toString
для объекта, который я получил от вызова функции. Я знаю, что тип объекта закодирован в этой строке, но я не знаю, как его прочитать.
Как называется этот тип кодирования?
[Ljava.lang.Object;
- это имя для Object[].class
, java.lang.Class
представляет класс массива Object
.
Схема именования описана в Class.getName()
:
Если этот объект класса представляет ссылочный тип, который не является типом массива, то возвращается двоичное имя класса, как указано в Спецификации языка Java (§13.1).
Если этот объект класса представляет тип примитива или
void
, то возвращаемое имя является ключевым словом языка Java, соответствующим типу примитива илиvoid
.Если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько символов
'['
, представляющих глубину вложения массива. Кодировка имен типов элементов выглядит следующим образом:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
Ваш последний в этом списке. Вот несколько примеров:
// xxxxx varies
System.out.println(new int[0][0][7]); // [[[[email protected]
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [[email protected]
Причина, по которой метод toString()
для массивов возвращает String
в этом формате, заключается в том, что массивы не @Override
метод, унаследованный от Object
, который указан следующим образом:
Метод
toString
для классаObject
возвращает строку, состоящую из имени класса, экземпляром которого является объект, символ знака "@" и шестнадцатеричное представление без знака для хеш-код объекта. Другими словами, этот метод возвращает строку, равную значению:getClass().getName() + '@' + Integer.toHexString(hashCode())
Примечание: вы не можете полагаться на toString()
любого произвольного объекта, чтобы следовать приведенной выше спецификации, поскольку они могут (и обычно делают) @Override
возвращать что-то еще. Более надежный способ проверки типа произвольного объекта состоит в том, чтобы вызвать getClass()
для него (метод final
, унаследованный от Object
), а затем отразить в возвращаемом Class
объект. В идеале, однако, API должен быть спроектирован таким образом, чтобы отражение не было необходимым (см. Effective Java 2nd Edition, Item 53: Предпочтение интерфейсов для отражения).
toString
для массивовjava.util.Arrays
предоставляет перегрузки toString
для примитивных массивов и Object[]
. Существует также deepToString
, который вы можете использовать для вложенных массивов.
Вот несколько примеров:
int[] nums = { 1, 2, 3 };
System.out.println(nums);
// [[email protected]
System.out.println(Arrays.toString(nums));
// [1, 2, 3]
int[][] table = {
{ 1, },
{ 2, 3, },
{ 4, 5, 6, },
};
System.out.println(Arrays.toString(table));
// [[[email protected], [[email protected], [[email protected]]
System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]
Есть также Arrays.equals
и Arrays.deepEquals
, которые выполняют сравнение равенства массивов по своим элементам, среди многих других утилитных методов, связанных с массивами.