Я получаю это, когда вызываю 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]); // [[[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
возвращает строку , состоящую из имени класса которого объект является экземпляром, на-знак символ `@», и без знака шестнадцатеричное представление хэш - кода объекта. Другими словами, этот метод возвращает строку, равную значению:getClass().getName() + '@' + Integer.toHexString(hashCode())
Примечание : вы не можете полагаться на то, чтоtoString()
какой-либо произвольный объект будет следовать приведенной выше спецификации, поскольку они могут (и обычно делают)@Override
это, чтобы вернуть что-то еще. Более надежный способ проверки типа произвольного объекта - вызватьgetClass()
его (final
метод, унаследованный отObject
), а затем проанализировать возвращаемыйClass
объект. В идеале, однако, API должен быть спроектирован таким образом, чтобы в отражении не было необходимости (см. Эффективное второе издание 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
которые выполняют сравнение на равенство массивов по их элементам.