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