¿Qué es esto: [Ljava.lang.Object ;?

110

Recibo esto cuando llamo toStringa 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?

Landon Kuhn
fuente

Respuestas:

211

[Ljava.lang.Object;es el nombre de Object[].class, que java.lang.Classrepresenta 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 o void.

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 Stringen este formato es porque las matrices no tienen @Overrideel método heredado Object, que se especifica de la siguiente manera:

El toStringmé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)@Overridepara devolver algo más. La forma más confiable de inspeccionar el tipo de un objeto arbitrario es invocarlogetClass()(unfinalmétodo heredadoObject) y luego reflexionar sobre elClassobjetodevuelto. 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 ).


En una forma más "útil" toStringpara matrices

java.util.Arraysproporciona toStringsobrecargas para matrices primitivas y Object[]. También es deepToStringposible 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.equalsy Arrays.deepEqualsque realizan una comparación de igualdad de matrices por sus elementos, entre muchos otros métodos de utilidad relacionados con matrices.

Preguntas relacionadas

poligenelubricantes
fuente