Я получаю это, когда вызываю 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которые выполняют сравнение на равенство массивов по их элементам.