En primer lugar, ¿puede responder rápidamente a la siguiente pregunta?
Sin el código de autocompletado de ningún IDE, ¿cómo obtener la longitud de una matriz? ¿Y cómo obtener la longitud de una cadena?
Hice esta pregunta a desarrolladores de diferentes niveles: básico e intermedio. No pueden responder la pregunta correctamente o con seguridad. Si bien IDE proporciona un conveniente autocompletado de código, también trae el problema de la «comprensión superficial». En esta publicación, explicaré algunos conceptos clave sobre las matrices de Java.
La respuesta:
int[] arr = new int[3]; System.out.println(arr.length);//length for array String str = "abc"; System.out.println(str.length());//length() for string |
La pregunta es ¿por qué la matriz tiene el campo de longitud pero la cadena no? ¿O por qué la cadena tiene el método length () mientras que la matriz no?
Q1. ¿Por qué las matrices tienen la propiedad de longitud?
En primer lugar, una matriz es un objeto contenedor que contiene un número fijo de valores de un solo tipo. Después de que se crea una matriz, su longitud nunca cambia[1]. La longitud de la matriz está disponible como longitud variable de instancia final. Por lo tanto, la longitud se puede considerar como un atributo definitorio de una matriz.
Una matriz se puede crear mediante dos métodos: 1) una expresión de creación de matriz y 2) un inicializador de matriz. Cuando se crea, se especifica el tamaño.
En el ejemplo anterior se usa 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.
Esta declaración también es legal, ya que especifica uno de los niveles de anidamiento.
int[][] arr = new int[3][]; |
Un inicializador de matriz crea una matriz y proporciona valores iniciales para todos sus componentes. Está escrito como una lista de expresiones separadas por comas, entre llaves {y}.
Por ejemplo,
int[] arr = {1,2,3}; |
Q2. ¿Por qué no hay una clase «Array» definida de manera similar como «String»?
Dado que una matriz es un objeto, el siguiente código es legal.
Object obj = new int[10]; |
Una matriz contiene todos los miembros heredados de la clase Object (excepto el clon). ¿Por qué no hay una definición de clase de una matriz? No podemos encontrar un archivo Array.java. Una explicación aproximada es que están ocultos para nosotros. Puede pensar en la pregunta: si HAY una clase Array, ¿cómo se vería? Todavía necesitaría una matriz para contener los datos de la matriz, ¿verdad? Por lo tanto, no es una buena idea definir tal clase.
De hecho, podemos obtener la clase de una matriz usando el siguiente código:
int[] arr = new int[3]; System.out.println(arr.getClass()); |
Producción:
clase [I
«class [I» stands for the run-time type signature for the class object «array with component type int».
Q3. Why String has length() method?
The backup data structure of a String is a char array. There is no need to define a field that is not necessary for every application. Unlike C, an Array of characters is not a String in Java.
References:
[1] Matrices
[2] Matriz JLS