Otrzymuję to, gdy wywołuję toString
obiekt, 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?
[Ljava.lang.Object;
jest nazwą Object[].class
The java.lang.Class
reprezentują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 lubvoid
.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 String
w tym formacie, jest to, że tablice nie @Override
są metodą dziedziczoną z Object
, która jest określona w następujący sposób:
toString
Metoda 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ą)@Override
to, aby zwrócić coś innego. Bardziej niezawodnym sposobem sprawdzenia typu dowolnego obiektu jest wywołaniegetClass()
na nim (final
metoda dziedziczona zObject
), a następnie refleksja na zwróconymClass
obiekcie. 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 ).
toString
dla tablicjava.util.Arrays
zapewnia toString
przeciążenia dla tablic pierwotnych i Object[]
. Jest też deepToString
to, ż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.equals
i Arrays.deepEquals
wykonują porównanie równości tablic według ich elementów, wśród wielu innych metod narzędziowych związanych z tablicami.