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

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

98 голосов
/ 09 августа 2010

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

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

1 Ответ

198 голосов
/ 09 августа 2010

[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 возвращает строку, состоящую из имени класса, экземпляром которого является объект, at-signсимвол `@ 'и шестнадцатеричное представление без знака хеш-кода объекта.Другими словами, этот метод возвращает строку, равную значению:

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

Смежные вопросы

...