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


110

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

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

Ответы:


211

[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которые выполняют сравнение на равенство массивов по их элементам.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.