Що це: [Ljava.lang.Object ;?


110

Це я отримую, коли я викликаю toStringоб'єкт, який я отримав від виклику функції. Я знаю, що тип об'єкта закодований у цьому рядку, але я не знаю, як його читати.

Як називається цей тип кодування?

Відповіді:


211

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

Пов'язані питання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.