Co to jest: [Ljava.lang.Object ;?

110

Otrzymuję to, gdy wywołuję toStringobiekt, który otrzymałem z wywołania funkcji. Wiem, że typ obiektu jest zakodowany w tym ciągu, ale nie wiem, jak go odczytać.

Jak nazywa się ten typ kodowania?

Landon Kuhn
źródło

Odpowiedzi:

211

[Ljava.lang.Object;jest nazwą Object[].classThe java.lang.Classreprezentujący klasę tablicy Object.

Schemat nazewnictwa jest udokumentowany w Class.getName():

Jeśli ten obiekt klasy reprezentuje typ referencyjny, który nie jest typem tablicowym, zwracana jest nazwa binarna klasy, zgodnie ze specyfikacją języka Java ( §13.1 ).

Jeśli ten obiekt klasy reprezentuje typ pierwotny lub void, wówczas zwracana nazwa jest słowem kluczowym języka Java odpowiadającym typowi pierwotnemu lub void.

Jeśli ten obiekt klasy reprezentuje klasę tablic, wówczas wewnętrzna postać nazwy składa się z nazwy typu elementu poprzedzonej jednym lub kilkoma '['znakami reprezentującymi głębokość zagnieżdżenia tablicy. Kodowanie nazw typów elementów jest następujące:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

Twój jest ostatni na tej liście. Oto kilka przykładów:

// 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

Powodem, dla którego toString()metoda na tablicach zwraca Stringw tym formacie, jest to, że tablice nie @Overridesą metodą dziedziczoną z Object, która jest określona w następujący sposób:

toStringMetoda klasyObject zwraca ciąg składający się z nazwą klasy, której obiekt jest instancją, postać `at-znak @” oraz unsigned reprezentację szesnastkową kodu hash obiektu. Innymi słowy, ta metoda zwraca ciąg równy wartości:

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

Uwaga : nie możesz polegać natoString()dowolnym dowolnym obiekcie, aby postępować zgodnie z powyższą specyfikacją, ponieważ mogą (i zwykle robią)@Overrideto, aby zwrócić coś innego. Bardziej niezawodnym sposobem sprawdzenia typu dowolnego obiektu jest wywołaniegetClass()na nim (finalmetoda dziedziczona zObject), a następnie refleksja na zwróconymClassobiekcie. Idealnie byłoby jednak, gdyby API zostało zaprojektowane w taki sposób, aby odbicie nie było konieczne (patrz Effective Java 2nd Edition, pozycja 53: Preferuj interfejsy do odbicia ).


O bardziej „użytecznym” toStringdla tablic

java.util.Arrayszapewnia toStringprzeciążenia dla tablic pierwotnych i Object[]. Jest też deepToStringto, że możesz chcieć użyć do zagnieżdżonych tablic.

Oto kilka przykładów:

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]]

Istnieją również Arrays.equalsi Arrays.deepEqualswykonują porównanie równości tablic według ich elementów, wśród wielu innych metod narzędziowych związanych z tablicami.

Powiązane pytania

smary wielogenowe
źródło