java: что это: [Ljava.lang.Object ;?

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

[Ljava.lang.Object; это имя Object[].class , java.lang.Class представляющего class массива Object .

Схема именования документирована в Class.getName() :

Если этот объект classа представляет ссылочный тип, который не является типом массива, тогда возвращается двоичное имя classа, как указано в Спецификации языка Java ( §13.1 ).

Если этот объект classа представляет собой примитивный тип или void , тогда возвращаемое имя является ключевым словом языка Java, соответствующим примитивному типу или void .

Если этот объект classа представляет class массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько символов '[' представляющих глубину вложенности массива. Кодирование имен типов элементов выглядит следующим образом:

 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]); // [[[[email protected] System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx System.out.println(new boolean[256]); // [[email protected] 

Причина, по которой метод toString() в массивах возвращает String в этом формате, состоит в том, что массивы не @Override метод, унаследованный от Object , который указан следующим образом:

Метод toString для classа Object возвращает строку, состоящую из имени classа, объектом которого является экземпляр, символа at-sign `@ ‘и шестизначного шестнадцатеричного представления хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

  getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Примечание : вы не можете полагаться на toString() любого произвольного объекта, чтобы следовать приведенной выше спецификации, так как они могут (и обычно делать) @Override чтобы вернуть что-то еще. Более надежным способом проверки типа произвольного объекта является вызов getClass() на нем ( final метод, унаследованный от Object ), а затем reflection на возвращаемом объекте Class . В идеале, однако, API должен был быть спроектирован таким образом, чтобы reflection не было необходимым (см. Эффективное Java 2nd Edition, пункт 53: Предпочитает интерфейсы для отражения ).


Об более «полезной» toString для массивов

java.util.Arrays предоставляет toString перегрузки для примитивных массивов и Object[] . Существует также deepToString который вы можете использовать для вложенных массивов.

Вот некоторые примеры:

  int[] nums = { 1, 2, 3 }; System.out.println(nums); // [[email protected] System.out.println(Arrays.toString(nums)); // [1, 2, 3] int[][] table = { { 1, }, { 2, 3, }, { 4, 5, 6, }, }; System.out.println(Arrays.toString(table)); // [[[email protected], [[email protected], [[email protected]] System.out.println(Arrays.deepToString(table)); // [[1], [2, 3], [4, 5, 6]] 

Существуют также Arrays.equals и Arrays.deepEquals которые выполняют сравнение равенства элементов по своим элементам, среди многих других методов, связанных с массивами.

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

  • Java Arrays.equals () возвращает false для двухмерных массивов. – углубленное освещение
  • Java-массив, NullPointerException?
  • C ++ передает массив по ссылке
  • «Int size = 10;» дает постоянное выражение?
  • Почему мне разрешено использовать переменную const, определенную как размер массива в C?
  • Общие правила передачи / возврата ссылки на массив (не указатель) на / из функции?
  • печать всего содержимого массива в C #
  • Определите, является ли JSON JSONObject или JSONArray
  • В ядре CUDA, как мне хранить массив в «локальной памяти streamа»?
  • Существуют ли другие распространенные «c-like» или «c-like» языки с ненулевой позицией индекса?
  • Использует ли гибкие члены массива в C плохой практике?
  • Как найти длину массива?
  • Давайте будем гением компьютера.