Це я отримую, коли я викликаю 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 2-е видання, пункт 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
які виконують порівняння рівності масивів за своїми елементами.