2011-05-10 9 views
37

Me preguntaba sobre la implementación de length de una matriz Java. Sé que el uso de arrayName.length nos da la cantidad de elementos en la matriz, pero nos preguntamos si se trata de un método/función o simplemente es un miembro de datos de Array.¿Cómo se implementa la longitud en las matrices de Java?

Supongo que debe ser un miembro de datos ya que no usamos paréntesis () al invocarlo. Pero si es un miembro de datos ¿cómo/cuándo se asigna/calcula el valor de este length?

+0

¿En algún lugar? Ni siquiera en el JLS? Es sintácticamente una variable miembro del objeto array, aunque no se puede asignar. – Ingo

+0

JLS .. JLS es la respuesta. –

Respuesta

39

De acuerdo con la especificación del lenguaje Java (específicamente §10.7 Array Members) que es un campo:

  • El campo lengthpublicfinal, que contiene el número de componentes de la matriz (longitud puede ser positivo o cero).

Internamente, el valor se almacena en algún lugar, probablemente, en la cabecera del objeto, sino que es un detalle de implementación y depende de la aplicación concreta de JVM.

El HotSpot VM (el que está en el Oracle populares (anteriormente Sun) JRE/JDK) stores the size in the object-header:

[...] matrices tienen un campo de encabezado en tercer lugar, para el tamaño de la matriz.

+4

Gracias amigos. Con sus respuestas útiles (y un poco de lectura), encontré que los "campos finales" se pueden establecer en una declaración de otro lugar (anteriormente había asumido erróneamente que solo se podían definir al mismo tiempo que se declararon). Así que supongo que el código de ctor de la clase Array calcula el número de elementos y asigna este valor a 'longitud'. –

+0

ahora hablamos de principiantes: D – bestsss

+0

¡buen trabajo! el libro blanco decía encabezado de objeto de dos palabras para el objeto simple, pero obtengo la información del encabezado mediante la herramienta Java-Object-Layout con un encabezado de objeto de 3 palabras. ¿Qué pasa? – Chao

0

Creo que es solo una propiedad cuando accede a ella como una propiedad.

String[] s = new String[]{"abc","def","ghi"} 
System.out.println(s.length) 

retornos 3

si era un método, entonces sería llamar s.length() derecho?

17

Está en lo correcto, length es un miembro de datos, no un método.

Desde el Arrays tutorial:

La longitud de una matriz se establece cuando se crea la matriz. Después de la creación, su longitud es fija.

+8

técnicamente ni siquiera es un campo, ya que la instrucción JVM no es 'GETFIELD' (pero ARRAYLENGTH), en el mismo aspecto la clase puede considerarse miembro de datos (también almacenado en el encabezado del objeto, o incluso parte del puntero) – bestsss

+2

@ bestsss: Eso puede ser técnicamente correcto, pero no sé si las instrucciones de JVM son el nivel adecuado de abstracción para responder a esta pregunta. El JLS llama 'longitud' tanto a un miembro como a un campo. http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#64347 –

+1

Desde la perspectiva de * language * es claramente un campo: se comporta exactamente igual que todas las demás 'public final' campos. –

1

Sí, debería ser un campo. Y creo que este valor se asigna cuando crea su matriz (tiene que elegir la longitud de la matriz al crear, por ejemplo: int[] a = new int[5];).

0

De los JLS:

longitud de la matriz está disponible como un última instancia longitud variable

Y:

Una vez que se crea un objeto de matriz, su longitud nunca cambia.Para hacer que una variable de matriz haga referencia a una matriz de diferente longitud, se debe asignar una referencia a diferente matriz a la variable.

Y las matrices se implementan en la JVM. Es posible que desee consultar el VM Spec para obtener más información.

0

Cada matriz en java es considerado como un objeto. El public final length es el data member que contiene el número de componentes de la matriz (length puede ser positivo o cero)

4

Si tiene una matriz de un tipo conocido o es una subclase de Object [] se puede emitir el array primero.

Object array = new ????[n]; 
Object[] array2 = (Object[]) array; 
System.out.println(array2.length); 

o

Object array = new char[n]; 
char[] array2 = (char[]) array; 
System.out.println(array2.length); 

Sin embargo, si usted no tiene idea de qué tipo de matriz es que puede utilizar Array.getLength (Objeto);

System.out.println(Array.getLength(new boolean[4]); 
System.out.println(Array.getLength(new int[5]); 
System.out.println(Array.getLength(new String[6]); 
0

matrices de Java, como matrices de C++, tienen la longitud fija que después de inicializarlo, no puede cambiarlo. Pero, al igual que el vector de plantilla de clase - vector <T> - en C++ puede usar la clase Java ArrayList que tiene muchas más utilidades que las matrices Java.

Cuestiones relacionadas