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