CodeGym /Cursos /JAVA 25 SELF /Introducción a los arrays

Introducción a los arrays

JAVA 25 SELF
Nivel 7 , Lección 1
Disponible

1. Un array es un contenedor de elementos

Probablemente hayas oído que los ordenadores pueden procesar enormes volúmenes de información. El operador condicional (if-else) y los bucles (for, while) ayudan, por supuesto. Pero no basta con eso: los datos que procesamos hay que almacenarlos de algún modo.

Para ello, en Java, como en prácticamente todos los lenguajes de programación, existe una cosa estupenda: los arrays (Array). También se les llama tablas.

Un array es un objeto especial en el que se puede almacenar no un único valor, sino varios.

Arrays (Array) in Java

Si antes comparábamos una variable con una caja (donde podemos guardar algún valor), entonces un array es más bien una caja dividida en secciones. Cada sección de la «caja‑array» tiene su número. La numeración, por supuesto, empieza en cero…

O podemos hacer otra analogía. Compare una casa unifamiliar con un edificio de pisos. Una casa unifamiliar la ocupa una familia, mientras que un edificio está dividido en pisos/apartamentos. Para enviar una carta a una familia que vive en una casa normal, hay que indicar su dirección única. Y para enviar una carta a una familia que vive en un piso, hay que indicar la dirección única del edificio y además el número del piso.

Así que, una variable‑array es como un edificio de pisos. En ella puedes almacenar no un solo valor, sino varios. En esa variable hay varios pisos (celdas), y a cada uno puedes acceder por su número (índice).

Para ello, después del nombre de la variable, entre corchetes, hay que indicar el índice de la celda a la que accedemos. Es bastante sencillo:


array[index] = value;
Asignar un valor a una celda del array por índice

Donde array es el nombre de la variable‑array, index es el número de la celda en el array, y value es el valor que queremos guardar en la celda indicada.

Pero antes, veamos cómo crear arrays.

2. Creación de un array de elementos en Java

Creación de un array de elementos en Java

Supongamos que tu programa necesita almacenar 100 números enteros. Lo más probable es que para esto sirva un array. ¿Y cómo se crea?

Si quisiéramos almacenar un solo número entero, usaríamos el typeo int; y si queremos almacenar 100 números enteros, probablemente necesitemos un array de typeo int. Así sería el código para crearlo:

int[] array = new int[100];
Crear un array de 100 números int

Analicemos qué pone aquí.

Como ya habrás adivinado, a la izquierda del signo igual tenemos la declaración de una variable llamada array y de typeo int[]. Tras el typeo int van los corchetes, que sugieren que en las «cajas» de este typeo se podrán guardar no un único valor, sino varios.

A la derecha del signo igual tenemos la «creación de un objeto» (la palabra new) con 100 elementos (celdas) de typeo int. Tampoco es muy complicado.

Si, por ejemplo, quisiéramos crear un array de 20 celdas para almacenar números de coma flotante, el código sería aproximadamente así:

double[] vals = new double[20];
Crear un array de 20 números de coma flotante

Al número de celdas de un array se le llama tamaño del array o longitud del array. Y por su capacidad de almacenar muchos valores, a los arrays también se les llama contenedores.

Dato importante: el tamaño del contenedor‑array no se puede cambiar después de su creación.

Se puede crear uno nuevo, pero no es posible cambiar la longitud de un contenedor ya creado.

3. Trabajo con las celdas del array

Bien, ya sabemos crear arrays, ¿y cómo trabajar correctamente con ellos?

Casi igual que con variables normales, solo que después del nombre de la variable‑array hay que indicar obligatoriamente el número de la celda con la que trabajamos.

La numeración de las celdas de un array siempre empieza en cero. Si tenemos un array de 10 elementos, entonces los números (índices) de sus celdas son 0..9; si el array es de 200 elementos, entonces 0..199. Y así sucesivamente.

Ejemplos:

int[] a = new int[10];	// Creamos un array de 10 elementos de typeo int.

a[2] = 4;				// En la celda con índice 2 guardamos el valor 4.

a[7] = 9;				// En la celda con índice 7 guardamos el valor 9.

a[9] = a[2] + a[5];		// En la celda con índice 9 guardamos la suma de los valores que hay en las celdas 2 	
                        // (hay 4) y 5 (hay 0). 

Esto es lo que habrá en memoria tras ejecutar el código anterior:

Trabajo con celdas de un array de typeo int

La columna a la izquierda del array (en gris) son los números (índices) de las celdas. En las celdas se almacenan los valores introducidos: 4, 9 y 4. Justo después de crear un array, sus celdas están rellenas con ceros.

Importante. Todas las celdas de un array tienen el mismo typeo de datos. Si hemos creado un array de cadenas String, en sus celdas solo se pueden almacenar cadenas. El typeo de datos del array se fija al crearlo. Ni el typeo de datos ni la longitud del array se pueden cambiar más adelante.

4. Arrays en memoria

Las imágenes de los ejemplos anteriores son un poco inexactas.

Al crear arrays (igual que al crear cadenas) se reservan dos bloques de memoria: uno para almacenar el propio array (el contenedor) y otro para la variable que almacena su dirección. La situación precisa se muestra en la imagen de abajo:

Arrays en memoria

En verde se muestra un array de 10 elementos de typeo int y una variable de typeo int[] que guarda la dirección (referencia) del array de typeo int en memoria.

Para comparar, en azul se indica una variable normal de typeo int, que almacena el valor 199.

Recuerda al almacenamiento de cadenas en memoria, ¿no te parece?

Exacto, las cadenas. Y como al trabajar con cadenas, las «variables de typeo array» se pueden asignar entre sí:

int[] a = new int[10];		// Creamos un array de 10 elementos de typeo int.

a[2] = 4;					// En la celda con índice 2 guardamos el valor 4.
a[7] = 9;					// En la celda con índice 7 guardamos el valor 9.

int[] b = a;				// En la variable b guardamos la dirección que hay en la variable a.
                            // Ahora a y b apuntan al mismo objeto‑array en memoria.

a[9] = b[2] + a[7];			// En la celda con índice 9 del objeto‑array guardamos la suma de los valores 
                            // que hay en las celdas 2 (hay 4) y 7 (hay 9). 

El objeto‑array seguirá donde estaba, y las variables a y b almacenarán direcciones (referencias) iguales al mismo objeto. Mira la imagen:

Arrays en memoria 2

5. Trabajo con arrays con más detalle

Se puede crear un array de absolutamente cualquier typeo. Solo hay que escribir corchetes después del nombre del typeo. La forma general de creación de un array es la siguiente:

type[] name = new type[quantity];
Forma canónica de crear un array

Donde type es el typeo de los elementos (celdas) del array que vamos a almacenar en él. Imya es el nombre de la variable con el que accederemos al array, y quantity es el número de celdas del array.

En el ejemplo anterior se muestra la forma canónica: creación de la variable‑array y creación del objeto‑array. En realidad son dos construcciones independientes. Se pueden crear la variable‑array y el objeto‑array por separado:

type[] name;
name = new type[quantity];
Creamos la variable y el array por separado

Y otro punto no menos importante

Tanto el índice del array como la cantidad de elementos del array pueden ser variables e incluso expresiones completas.

Ejemplos:

int n = 100;
int[] a = new int[n];			// 	Creamos un array de n elementos

int n = 100;
int[] a = new int[n * 2 + 3];	// 	Creamos un array de 203 elementos

int n = 100;
int[] a = new int[n];
a[n-1] = 2;					// a[99] = 2;
a[n-2] = 3;					// a[98] = 3;
a[n/5] = a[n-1] + a[n-2]	// a[20] = a[99] + a[98];

Salir de los límites del array

Por cierto, ten en cuenta que si intentas acceder a una celda del array con un índice que el array no tiene (en nuestro caso, cualquier número entero excepto los números 0..99), el programa terminará abruptamente con el error ArrayIndexOutOfBoundsException — índice fuera de los límites del array.

6. Longitud del array

Como vimos en el ejemplo anterior, se puede crear por separado una variable de typeo array y luego, en algún punto del código, asignarle un valor (una referencia a un objeto‑array). Incluso se puede hacer así:

int[] array;			//	Creamos una variable‑array de typeo int[]
if (a < 10)				// Si la variable a es menor que 10,
   array = new int[10];	// entonces crear un array de 10 elementos.
else					// En caso contrario
   array = new int[20];	// crear un array de 20 elementos 

¿Y cómo trabajar después con ese array? ¿Cómo saber cuántos elementos tiene?

Para ello, el array tiene una propiedad especial (variable) — length. Y se puede conocer la longitud del array con la siguiente expresión:

array.length;
Obtener la longitud del array mediante la propiedad length

Donde array es el nombre de la variable‑array, y length es el nombre de la propiedad del objeto‑array. El valor de la propiedad length no se puede cambiar: se puede asignar la propiedad length a otras variables, pero a ella no se le puede asignar nada (el programa simplemente no compilará).

Así podemos continuar el ejemplo anterior:

int[] array;			//	Creamos una variable‑array de typeo int[]
if (a < 10)				// Si la variable a es menor que 10,
   array = new int[10];	// entonces crear un array de 10 elementos.
else					// En caso contrario
   array = new int[20];	// crear un array de 20 elementos 

for (int i = 0; i < array.length; i++)	// Bucle por todos los elementos del array: de 0 hasta array.length - 1
{
   System.out.println(array[i]);
}

7. Hechos sobre los arrays en Java

Resumamos los hechos conocidos sobre los arrays:

  • Hecho 1. Un array consta de múltypeles celdas.
  • Hecho 2. El acceso a una celda concreta se realiza indicando su número.
  • Hecho 3. Todas las celdas son del mismo typeo.
  • Hecho 4. El valor inicial de todas las celdas es 0 y null (si en la celda se almacena una dirección), false (para el typeo boolean).
  • Hecho 5. String[] list es solo la declaración de una variable: el contenedor (el objeto‑array) aún no se ha creado. Para poder trabajar con él, hay que crear el array (contenedor) y guardarlo en esa variable, y solo entonces usarlo. Ver ejemplo abajo.
  • Hecho 6. Cuando creamos un objeto‑array (contenedor), hay que indicar su longitud — cuántas celdas tiene. Esto se hace con un comando del typeo: new TypeName[n];
  • Hecho 7. La longitud del array se puede conocer a través de la propiedad .length.
  • Hecho 8. Después de crear un array no se puede cambiar ni el typeo de sus elementos ni su cantidad.
String s;				// s es igual a null
String[] list;			// list es igual a null

list = new String[10];	// La variable list guarda una referencia a un objeto: un array de cadenas de 10 elementos.
int n = list.length;	// n es igual a 10

list = new String[0];	// Ahora list contiene un array de 0 elementos. 
                        // El array existe, pero no puede almacenar elementos.

list = null;
System.out.println(list[1]); // Se generará un error — el programa terminará abruptamente. 
                            // list contiene una referencia vacía — null

list = new String[10];
System.out.println(list[10]);	// Se generará un error — fuera de los límites del array.
//	Si list contiene 10 elementos/celdas, los índices permitidos son: 0 1 2 3 4 5 6 7 8 9 — en total 10. 	
1
Tarea
JAVA 25 SELF, nivel 7, lección 1
Bloqueada
Preparando la mochila del buscador de aventuras 🎒
Preparando la mochila del buscador de aventuras 🎒
1
Tarea
JAVA 25 SELF, nivel 7, lección 1
Bloqueada
Evaluación de la lista de lenguajes de programación favoritos 💬
Evaluación de la lista de lenguajes de programación favoritos 💬
1
Tarea
JAVA 25 SELF, nivel 7, lección 1
Bloqueada
Configuración de los sensores de la estación meteorológica ☀️
Configuración de los sensores de la estación meteorológica ☀️
1
Tarea
JAVA 25 SELF, nivel 7, lección 1
Bloqueada
Rellenado del marcador del torneo 🏆
Rellenado del marcador del torneo 🏆
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION