Recibo esto cuando llamo toString
a un objeto que recibí de una llamada de función. Sé que el tipo de objeto está codificado en esta cadena, pero no sé cómo leerlo.
¿Cómo se llama este tipo de codificación?
[Ljava.lang.Object;
es el nombre de Object[].class
, que java.lang.Class
representa la clase de matriz de Object
.
El esquema de nomenclatura está documentado en Class.getName()
:
Si este objeto de clase representa un tipo de referencia que no es un tipo de matriz, se devuelve el nombre binario de la clase, según lo especificado por la Especificación del lenguaje Java ( §13.1 ).
Si este objeto de clase representa un tipo primitivo o
void
, entonces el nombre devuelto es la palabra clave del lenguaje Java correspondiente al tipo primitivo ovoid
.Si este objeto de clase representa una clase de matrices, entonces la forma interna del nombre consiste en el nombre del tipo de elemento precedido por uno o más
'['
caracteres que representan la profundidad del anidamiento de la matriz. La codificación de los nombres de los tipos de elementos es la siguiente:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
El tuyo es el último de esa lista. Aquí hay unos ejemplos:
// 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
La razón por la que el toString()
método en matrices regresa String
en este formato es porque las matrices no tienen @Override
el método heredado Object
, que se especifica de la siguiente manera:
El
toString
método de claseObject
devuelve una cadena que consta del nombre de la clase de la que el objeto es una instancia, el carácter de signo de arroba `@ 'y la representación hexadecimal sin signo del código hash del objeto. En otras palabras, este método devuelve una cadena igual al valor de:getClass().getName() + '@' + Integer.toHexString(hashCode())
Nota : no puede confiar en quetoString()
ningún objeto arbitrario siga la especificación anterior, ya que pueden (y generalmente lo hacen)@Override
para devolver algo más. La forma más confiable de inspeccionar el tipo de un objeto arbitrario es invocarlogetClass()
(unfinal
método heredadoObject
) y luego reflexionar sobre elClass
objetodevuelto. Idealmente, sin embargo, la API debería haber sido diseñada de tal manera que la reflexión no sea necesaria (consulte Eficaz segunda edición de Java, artículo 53: Prefiera interfaces a la reflexión ).
toString
para matricesjava.util.Arrays
proporciona toString
sobrecargas para matrices primitivas y Object[]
. También es deepToString
posible que desee utilizar para matrices anidadas.
Aquí hay unos ejemplos:
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]]
También existen Arrays.equals
y Arrays.deepEquals
que realizan una comparación de igualdad de matrices por sus elementos, entre muchos otros métodos de utilidad relacionados con matrices.