Arrays en Java

Declaración, inicialización y limitaciones frente a las colecciones

Declaración e inicialización

Los arrays en Java son objetos de tamaño fijo. Todos los elementos se inicializan automáticamente a su valor por defecto: 0 para numéricos, false para boolean, null para referencias.

// Declaración e inicialización de arrays
int[] numeros = new int[5];          // array de 5 enteros, inicializados a 0
String[] nombres = new String[3];    // array de 3 referencias, inicializadas a null

// Inicialización con valores
int[] primos = {2, 3, 5, 7, 11};    // array literal
int[] pares  = new int[]{2, 4, 6};  // equivalente explícito

// Arrays multidimensionales (arrays de arrays)
int[][] matriz = new int[3][4];      // 3 filas, 4 columnas
int[][] irregular = {{1,2}, {3,4,5}, {6}}; // filas de distinto tamaño

Acceso y operaciones

La clase utilitaria java.util.Arrays proporciona sort, binarySearch, copyOf, fill y equals. Para comparar el contenido de dos arrays usa Arrays.equals(), no == ni .equals().

int[] datos = {10, 20, 30, 40, 50};

// Acceso por índice (base 0)
int primero = datos[0];  // 10
int ultimo  = datos[datos.length - 1]; // 50

// datos.length: longitud (no método, es un campo)
for (int i = 0; i < datos.length; i++) {
    System.out.println(datos[i]);
}

// ArrayIndexOutOfBoundsException si se accede fuera de rango
datos[5]; // Error: índice válido es 0..4

// Copiar arrays
int[] copia = Arrays.copyOf(datos, datos.length);
int[] subcopia = Arrays.copyOfRange(datos, 1, 4); // {20, 30, 40}

// Ordenar
Arrays.sort(datos);

// Buscar en array ordenado
int pos = Arrays.binarySearch(datos, 30); // índice del elemento

Limitaciones y conversión a colecciones

// Arrays: limitaciones frente a las colecciones

// 1. Tamaño fijo: no se puede cambiar una vez creado
int[] arr = new int[3];
// arr.add(4); → no existe: usar ArrayList<Integer>

// 2. No implementan Iterable directamente para uso con generics
// 3. No tienen métodos de utilidad (add, remove, contains...)

// Convertir array a List (y viceversa)
String[] array = {"a", "b", "c"};
List<String> lista = Arrays.asList(array); // vista fija: no se puede añadir/eliminar
List<String> listaMutable = new ArrayList<>(Arrays.asList(array)); // mutable

// Arrays de primitivos NO pueden convertirse directamente a List<Integer>
// int[] no es lo mismo que Integer[] para los generics
int[] primitivos = {1, 2, 3};
Integer[] envolventes = {1, 2, 3}; // hay que usar el tipo wrapper
List<Integer> listaEntera = Arrays.asList(envolventes);

Cuándo usar arrays

// Cuándo usar arrays en Java 8:

// SÍ: cuando el tamaño es fijo y el rendimiento importa
byte[] buffer = new byte[4096]; // buffer de E/S
int[] fibonacci = new int[n];   // tabla precalculada

// SÍ: la API lo requiere (varargs, bytes de red, criptografía...)
void escribir(byte[] datos) { ... }
MessageDigest.digest() // devuelve byte[]

// NO: para colecciones de tamaño variable → ArrayList
// NO: para búsquedas frecuentes → HashSet / HashMap
// NO: para colas o pilas → ArrayDeque / LinkedList
En código Java moderno, los arrays de objetos apenas se usan directamente. Se usan en APIs de bajo nivel (E/S, criptografía, JNI), en código legacy y cuando el rendimiento con primitivos es crítico. Para todo lo demás, las colecciones del siguiente apartado son la opción adecuada.

Siguiente apartado → Conversiones de tipo: widening, narrowing y casting

Índice de la sección

Índice del curso