Eu entendo isso quando chamo toString
um 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?
[Ljava.lang.Object;
é o nome de Object[].class
, o que java.lang.Class
representa 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 ouvoid
.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 String
neste formato é porque as matrizes não possuem @Override
o método herdado de Object
, que é especificado da seguinte maneira:
O
toString
mé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)@Override
para retornar outra coisa. A maneira mais confiável de inspecionar o tipo de um objeto arbitrário é invocágetClass()
-lo (umfinal
método herdado deObject
) e, em seguida, refletir sobre oClass
objetoretornado. 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 ).
toString
para matrizesjava.util.Arrays
fornece toString
sobrecargas para matrizes primitivas e Object[]
. Há também deepToString
que 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.equals
e Arrays.deepEquals
que realizam comparação de igualdade de array por seus elementos, entre muitos outros métodos de utilitário relacionados a array.