Un array es una lista de tamaño fijo
Un array en Java guarda un número fijo de valores del mismo tipo, dispuestos en orden y accesibles por su posición. "Fijo" es la palabra clave: una vez que creas un array, su longitud nunca cambia. Y "mismo tipo": un int[] solo guarda valores int, un String[] solo guarda cadenas. Esa rigidez es el precio que pagas a cambio de que los arrays sean rápidos y compactos en memoria.
Declaras un tipo de array poniendo [] después del tipo del elemento, y luego o le asignas un literal o reservas uno con new:
Los corchetes pueden ir después del tipo (int[] scores) o después del nombre (int scores[]). Ambas formas compilan, pero int[] scores es el estilo idiomático de Java - pon los [] junto al tipo, que es donde corresponden.
Crear un array con new
Cuando aún no conoces los valores pero sí conoces el tamaño, usa new. Esto reserva las posiciones y las rellena con el valor por defecto del tipo:
Los valores por defecto no son basura aleatoria - Java inicializa cada elemento a cero. Los tipos numéricos empiezan en 0 (o 0.0), boolean empieza en false, y los tipos de referencia como String empiezan en null. Ese null conviene recordarlo: un String[] recién reservado está lleno de nulls, y llamar a un método sobre uno de ellos lanza un NullPointerException.
La indexación empieza en cero
Lees y escribes elementos por índice, contando desde 0. El último índice válido es siempre length - 1:
A diferencia de los arrays de algunos lenguajes de scripting, salirte del rango no te devuelve silenciosamente null ni undefined - lanza una excepción. Prueba a leer un índice que no existe:
Ese programa se cae con:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
Este es uno de los errores más comunes entre principiantes. La solución casi siempre es un error de uno en uno (off-by-one) en la condición de un bucle - usar <= donde querías <.
length es un campo, no un método
Cada array lleva su tamaño en un campo length. Atención: sin paréntesis.
Aquí va un detalle que pilla a todo el mundo al menos una vez: los arrays usan .length (un campo), pero String usa .length() (un método). Escribir nums.length() en un array es un error de compilación, y escribir text.length en una cadena también. La misma palabra, reglas distintas - la del array no lleva paréntesis.
Recorrer un array
Aprendiste el bucle for-each en la página anterior, y es la forma más limpia de leer todos los elementos cuando no necesitas el índice:
Cuando necesitas el índice - para imprimir números de posición, modificar elementos en el sitio o iterar hacia atrás - recurre al clásico bucle for indexado usando length como límite:
La condición es i < names.length, no <=. Usar <= da un paso de más y lanza la excepción de fuera de rango de la sección anterior. Una regla rápida: for-each cuando solo lees valores, for indexado cuando necesitas la posición o quieres escribir de vuelta en el array.
Arrays multidimensionales
Un array 2D es en realidad un array de arrays - imagínalo como una cuadrícula de filas y columnas. Añades un segundo par de corchetes:
grid[fila][columna] selecciona una sola celda. Como cada fila es su propio array, grid.length es el número de filas y grid[0].length es el número de columnas de la primera fila. Las filas ni siquiera tienen que tener la misma longitud (eso se llama array irregular o jagged), aunque la mayoría de las cuadrículas son rectangulares.
La clase de utilidad Arrays
Los arrays en sí casi no tienen métodos - no puedes ordenar ni imprimir uno directamente de forma útil. Java proporciona una clase de utilidad java.util.Arrays llena de ayudantes estáticos precisamente para esto:
Aquí hay un par de cosas en las que apoyarse. Arrays.toString(arr) es la forma correcta de imprimir un array - imprimir uno directamente te da una cadena inútil como [I@1b6d3586. Arrays.sort ordena en el sitio. Arrays.copyOf es como se "redimensiona": devuelve un array nuevo de la longitud que pidas, rellenando con valores por defecto (las dos posiciones extra de arriba son 0). Y Arrays.binarySearch solo funciona correctamente sobre un array que ya esté ordenado.
Arrays frente a ArrayList
Usa un array normal cuando el tamaño se conoce de antemano y no va a cambiar - un conjunto fijo de días de la semana, un tablero de juego, datos de píxeles. Los arrays son rápidos y ligeros, pero su longitud fija es una limitación real: no puedes añadir un séptimo elemento a un array de longitud 6 sin construir uno completamente nuevo.
En cuanto necesitas añadir y eliminar elementos con libertad, un array se vuelve incómodo. Para eso está ArrayList - una lista redimensionable que puede crecer y que se encarga de la copia por ti.
Siguiente: ArrayList
Cuando no sabes cuántos elementos tendrás, o ese número cambia mientras tu programa se ejecuta, un array de longitud fija se interpone en el camino. ArrayList es la respuesta de Java: una lista que crece y se encoge según se necesite, con métodos add y remove en lugar de hacer malabares con índices. Eso es lo que viene a continuación.
Preguntas frecuentes
¿Cómo se declara e inicializa un array en Java?
Declara el tipo con corchetes y asígnale un literal: int[] nums = {1, 2, 3};. Para crear un array vacío de tamaño fijo, usa new: int[] nums = new int[5]; - eso te da 5 posiciones, cada una rellena con el valor por defecto (0 para int, null para objetos).
¿Cómo obtengo la longitud de un array en Java?
Usa el campo length (sin paréntesis): nums.length. Es un campo, no un método, así que nums.length() es un error de compilación. Ten en cuenta que String usa .length() con paréntesis, pero los arrays usan .length sin ellos - una confusión clásica.
¿Puede un array de Java cambiar de tamaño después de crearse?
No. Un array de Java tiene una longitud fija que se establece al crearlo y no puedes hacerlo crecer ni encogerlo. Si necesitas una lista que cambie de tamaño, usa un ArrayList. Para "redimensionar" un array tendrías que crear uno nuevo más grande y copiar los elementos.
¿Qué es ArrayIndexOutOfBoundsException en Java?
Es el error en tiempo de ejecución que obtienes cuando accedes a un índice que no existe - menor que 0 o >= array.length. A diferencia de otros lenguajes, Java no devuelve un valor por defecto ni null para accesos fuera de rango; lanza una excepción. Los índices válidos siempre van de 0 a length - 1.