Podemos determinar la duración de un ArrayList<E>
uso de su método público size()
, como
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
Del mismo modo, podemos determinar la longitud de un Array
objeto utilizando la length
propiedad
String[] str = new String[10];
int size = str.length;
Mientras que el size()
método de ArrayList
se define dentro de la ArrayList
clase, ¿dónde está definida esta length
propiedad de Array
?
Respuestas:
Las matrices son objetos especiales en Java, tienen un atributo simple llamado
length
cual esfinal
.No hay una "definición de clase" de una matriz (no se puede encontrar en ningún archivo .class), son parte del lenguaje en sí.
Recursos:
fuente
ArrayList.size()
proporciona el número de objetos realmente almacenados en la matriz, mientras quemyArray.length
([]
) proporciona la "capacidad". Es decir, si es así,myArray = new int[10];
devuelve 10. No es el número de objetos que ha puesto en la matriz.List
porque usa matrices en sus implementaciones.Se trata de "especial", básicamente, con su propio código de bytes de instrucciones:
arraylength
. Entonces este método:se compila en bytecode así:
Por lo tanto, no se accede como si fuera un campo normal. De hecho, si intenta obtenerlo como si fuera un campo normal, como este, falla:
Desafortunadamente, la descripción de JLS de cada tipo de matriz que tiene un campo final público
length
es algo engañosa :(fuente
int[]
cuando los genéricos no se aplican a los tipos primitivos? (Y diablos, los genéricos no existían desde hace mucho tiempo de todos modos.) Usted podría escapar sin matrices, usando listas enlazadas para todas las colecciones, pero sería terrible para la eficiencia.StringBuffer
clase en sí, sí, porque contiene una referencia a unchar[]
(o al menos lo hizo; no sé si todavía lo hace, de forma manual). Entonces, aunque aStringBuilder
es responsable de más memoria, su tamaño y diseño inmediatos son fijos.Está definido en la especificación del lenguaje Java :
Dado que hay un número ilimitado de tipos de matriz (para cada clase hay un tipo de matriz correspondiente, y luego hay matrices multidimensionales), no se pueden implementar en un archivo de clase; JVM tiene que hacerlo sobre la marcha.
fuente
Aunque esta no es una respuesta directa a la pregunta, es una adición al argumento
.length
vs..size()
Estaba investigando algo relacionado con esta pregunta, así que cuando la encontré me di cuenta de que las definiciones proporcionadas aquíno es "exactamente" correcto.
La longitud del campo contiene el número de lugares disponibles para colocar un componente, no el número de componentes presentes en la matriz. Por lo tanto, representa la memoria total disponible asignada a esa matriz, no la cantidad de memoria que se llena.
Ejemplo:
Salida:
Sin embargo, la
.size()
propiedad delArrayList
da el número de elementos en la lista:Salida:
fuente
null
elementos no nulos. Pero la distinción no funciona. Después de todo, elsize()
de (digamos) aList
puede incluirnull
valores también.size
comporta dinámicamente, mientras quelength
es una propiedad estática ... el hecho de que el espacio sin llenar restante en una matriz se inicializa a " No valores " (dependiendo del tipo) realmente no contradice este punto.es el campo público final, que contiene el número de componentes de la matriz (la longitud puede ser positiva o cero)
Por lo tanto, una matriz tiene los mismos campos y métodos públicos que la siguiente clase:
más información en
10.7 Miembros de la matriz
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
fuente
Para responder como está, ¿ dónde está definida esta propiedad de longitud de la matriz ? En un especial
Object header
.Fácil de ver a través de JOL
Una de las líneas de esta salida será:
Por lo general, los objetos tienen dos encabezados (mark y klass), las matrices tienen uno más que siempre ocupan
4 bytes
longitud, comosize
es unint
.fuente
La longitud de la palabra clave actúa como un archivo de datos definido. Cuando se usa en una matriz, podemos usarla para acceder a cuántos elementos hay en una matriz. Con respecto a String [], podemos invocar el método length () definido en la clase String. Con respecto a ArrayList, podemos usar el método size () definido en ArrayList. Tenga en cuenta que al crear una lista de matriz con ArrayList <> (capacidad), el tamaño inicial () de esta lista de matriz es cero ya que no hay ningún elemento.
fuente