¿Cómo puedo obtener el tamaño de una matriz, una Colección o una Cadena en Java?

¿Cuáles son las diferentes formas en que puedo acceder a la longitud de una matriz, una colección ( List , Set , etc.) y un objeto String ? ¿Por qué es diferente?

Reducido:

Para una matriz: use .length .

Para una Collection (o Map ): use .size() .

Para una CharSequence (que incluye CharBuffer , Segment , String , StringBuffer y StringBuilder ): use .length() .


Arrays

Uno usaría la propiedad .length en una matriz para acceder a ella. A pesar de que una matriz es un Object creado dinámicamente, el mandato para la propiedad de length está definido por la Especificación del lenguaje Java, §10.3 :

Una matriz se crea mediante una expresión de creación de matriz (§15.10) o un inicializador de matriz (§10.6) .

Una expresión de creación de matriz especifica el tipo de elemento, el número de niveles de matrices anidadas y la longitud de la matriz para al menos uno de los niveles de anidación. La longitud de la matriz está disponible como length variable de instancia final.

Un inicializador de matriz crea una matriz y proporciona valores iniciales para todos sus componentes.

Como la longitud de una matriz no puede cambiar sin la creación de una nueva instancia de matriz, los accesos repetidos de .length no cambiarán el valor , independientemente de lo que se haga a la instancia de la matriz (a menos que su referencia sea reemplazada por una matriz de diferente tamaño).

Como ejemplo, para obtener la longitud de una matriz unidimensional declarada, uno podría escribir esto:

 double[] testScores = new double[] {100.0, 97.3, 88.3, 79.9}; System.out.println(testScores.length); // prints 4 

Para obtener longitudes en una matriz n- dimensional, se debe tener en cuenta que están accediendo a una dimensión de la matriz a la vez.

Aquí hay un ejemplo para una matriz bidimensional.

 int[][] matrix = new int[][] { {1, 2, 3, 4}, {-1, 2, -3, 4}, {1, -2, 3, -4} }; System.out.println(matrix.length); // prints 3 (row length or the length of the array that holds the other arrays) System.out.println(matrix[0].length); // prints 4 (column length or the length of the array at the index 0) 

Esto es importante de usar, especialmente en el caso de arreglos dentados ; las columnas o filas no siempre se alinean todo el tiempo.

Colecciones ( Set , List , etc.)

Para cada objeto que implemente la interfaz de Collection , tendrán un método llamado size() con el que acceder al tamaño total de la colección.

A diferencia de las matrices, las colecciones no son de longitud fija y pueden tener elementos agregados o eliminados en cualquier momento. Una llamada a size() producirá un resultado distinto de cero si y solo si se ha agregado algo a la lista.

Ejemplo:

 List shoppingList = new ArrayList<>(); shoppingList.add("Eggs"); System.out.println(shoppingList.size()); // prints 1 

Ciertas colecciones pueden negarse a agregar un elemento, ya sea porque es null o es un duplicado (en el caso de un Set ). En este caso, las adiciones repetidas a la colección no boostán el tamaño.

Ejemplo:

 Set uniqueShoppingList = new HashSet<>(); uniqueShoppingList.add("Milk"); System.out.println(uniqueShoppingList.size()); // prints 1 uniqueShoppingList.add("Milk"); System.out.println(uniqueShoppingList.size()); // prints 1 

El acceso al tamaño de una List> * se realiza de forma similar a una matriz dentada:

 List> oddCollection = new ArrayList<>(); List numbers = new ArrayList() {{ add(1); add(2); add(3); }}; oddCollection.add(numbers); System.out.println(oddCollection.size()); // prints 1 System.out.println(oddCollection.get(0).size()); // prints 3 

*: Collection no tiene el método get definido en su interfaz.

Como un lado, un Map no es una Collection , pero también tiene un método de size() definido. Esto simplemente devuelve la cantidad de pares clave-valor contenidos en el Map .

String

Una String tiene una length() método length() definida. Lo que hace es imprimir el número de caracteres presentes en esa instancia de la String .

Ejemplo:

 System.out.println("alphabet".length()); // prints 8 

No olvide CollectionUtils.size() de la biblioteca de commons , es nulo seguro para que no tenga que anular la comprobación de antemano.