O que é isso: [Ljava.lang.Object ;?

110

Eu entendo isso quando chamo toStringum objeto que recebi de uma chamada de função. Eu sei que o tipo de objeto está codificado nesta string, mas não sei como lê-lo.

Como é chamado esse tipo de codificação?

Landon Kuhn
fonte

Respostas:

211

[Ljava.lang.Object;é o nome de Object[].class, o que java.lang.Classrepresenta a classe do array de Object.

O esquema de nomenclatura está documentado em Class.getName():

Se este objeto de classe representa um tipo de referência que não é um tipo de array, o nome binário da classe é retornado, conforme especificado pela Especificação de linguagem Java ( §13.1 ).

Se este objeto de classe representa um tipo primitivo ou void, o nome retornado é a palavra-chave da linguagem Java correspondente ao tipo primitivo ou void.

Se este objeto de classe representa uma classe de matrizes, a forma interna do nome consiste no nome do tipo de elemento precedido por um ou mais '['caracteres que representam a profundidade do aninhamento da matriz. A codificação dos nomes de tipo de elemento é a seguinte:

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

O seu é o último da lista. aqui estão alguns exemplos:

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

O motivo pelo qual o toString()método em matrizes retorna Stringneste formato é porque as matrizes não possuem @Overrideo método herdado de Object, que é especificado da seguinte maneira:

O toStringmétodo para classObject retorna uma string que consiste no nome da classe da qual o objeto é uma instância, o caractere de arroba `@ 'e a representação hexadecimal sem sinal do código hash do objeto. Em outras palavras, este método retorna uma string igual ao valor de:

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

Nota : você não pode confiar notoString()de qualquer objeto arbitrário para seguir a especificação acima, uma vez que eles podem (e geralmente fazem)@Overridepara retornar outra coisa. A maneira mais confiável de inspecionar o tipo de um objeto arbitrário é invocágetClass()-lo (umfinalmétodo herdado deObject) e, em seguida, refletir sobre oClassobjetoretornado. Idealmente, porém, a API deveria ter sido projetada de forma que a reflexão não seja necessária (consulte Effective Java 2ª Edição, Item 53: Preferir interfaces à reflexão ).


De uma forma mais "útil" toStringpara matrizes

java.util.Arraysfornece toStringsobrecargas para matrizes primitivas e Object[]. Há também deepToStringque você pode querer usar para matrizes aninhadas.

aqui estão alguns exemplos:

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

Existem também Arrays.equalse Arrays.deepEqualsque realizam comparação de igualdade de array por seus elementos, entre muitos outros métodos de utilitário relacionados a array.

Perguntas relacionadas

poligenelubrificantes
fonte