Clase utilitaria Arrays de Java
Usa java.util.Arrays para ordenar, buscar, rellenar, comparar y convertir arrays en Java.
java.util.Arrays es la colección de funciones auxiliares para arrays de la biblioteca estándar. Es una clase final con solo métodos static — nunca se instancia, simplemente se llaman sus métodos directamente: Arrays.sort(...), Arrays.toString(...), etc. Una vez que conoces su contenido, el código que escribes para manejar arrays se vuelve mucho más corto.
Este capítulo es un recorrido guiado. La ordenación y la copia tienen sus propios capítulos; aquí nos enfocamos en el resto.
Importación
import java.util.Arrays;Casi todos los ejemplos siguientes asumen esta importación.
toString y deepToString
Convierte un array en una cadena legible. toString maneja arrays unidimensionales:
int[] data = {3, 1, 4};
String s = Arrays.toString(data); // "[3, 1, 4]"deepToString formatea recursivamente arrays anidados:
int[][] grid = {{1, 2}, {3, 4}};
String s = Arrays.deepToString(grid); // "[[1, 2], [3, 4]]"Ambos funcionan con tipos de elementos primitivos y de objeto.
equals y deepEquals
== compara referencias de arrays. Para comparar contenidos:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
boolean same = Arrays.equals(a, b); // truePara arrays anidados usa deepEquals:
int[][] g1 = {{1, 2}, {3, 4}};
int[][] g2 = {{1, 2}, {3, 4}};
boolean same = Arrays.deepEquals(g1, g2); // trueAmbos consideran que null == null es true.
hashCode y deepHashCode
Hashes basados en contenido, útiles cuando una clase envuelve un array y necesita equals/hashCode:
int[] data = {1, 2, 3};
int h = Arrays.hashCode(data);Si sobreescribes equals para usar Arrays.equals, debes sobreescribir hashCode para usar Arrays.hashCode y mantener el contrato.
fill
Establece todos los elementos con un valor, o establece un rango:
int[] data = new int[5];
Arrays.fill(data, 7); // {7, 7, 7, 7, 7}
Arrays.fill(data, 1, 4, 0); // zero indexes 1..3sort y parallelSort
Ordenación en sitio, ascendente:
int[] data = {3, 1, 4, 1, 5};
Arrays.sort(data); // {1, 1, 3, 4, 5}Para arrays muy grandes puedes usar parallelSort para distribuir el trabajo en múltiples núcleos. La historia completa sobre ordenación — primitivos, objetos, órdenes personalizados — está en el capítulo Ordenar arrays.
binarySearch
Encuentra un elemento en un array ordenado en O(log n):
int[] sorted = {1, 3, 5, 7, 9};
int idx = Arrays.binarySearch(sorted, 5); // 2
int miss = Arrays.binarySearch(sorted, 6); // negative — encodes insertion pointSi el elemento no está presente, el valor de retorno es -(insertionPoint) - 1. Así, miss == -4 significa que el 6 pertenecería al índice 3. Si la entrada no está ordenada, el resultado es indefinido — ordena primero.
copyOf y copyOfRange
Devuelven un nuevo array, copiando valores de uno existente:
int[] data = {1, 2, 3, 4, 5};
int[] all = Arrays.copyOf(data, data.length); // exact copy
int[] grown = Arrays.copyOf(data, 8); // padded with zeros
int[] slice = Arrays.copyOfRange(data, 1, 4); // {2, 3, 4}Estos se tratan en detalle en Copiar arrays.
asList
Envuelve un array de referencias como una List de tamaño fijo:
String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr);La lista está respaldada por el array — list.set(0, "z") también cambia arr[0]. El tamaño es fijo, por lo que add/remove lanzan excepciones. Con arrays primitivos no hace lo que esperarías: Arrays.asList(new int[]{1, 2, 3}) produce una List<int[]> de longitud uno. Para primitivos, conviértelos a boxed primero con streams.
stream
Obtén un stream de cualquier array numérico o de objetos:
int[] nums = {3, 1, 4, 1, 5};
int sum = Arrays.stream(nums).sum();
double avg = Arrays.stream(nums).average().orElse(0);Para arrays de objetos, Arrays.stream(arr) devuelve un Stream<T>. También existen formas con rango limitado — Arrays.stream(arr, from, to).
setAll y parallelSetAll
Rellena un array usando una función del índice:
int[] squares = new int[6];
Arrays.setAll(squares, i -> i * i);
// {0, 1, 4, 9, 16, 25}Usa setAll cuando quieras una secuencia derivada y un bucle for solo añadiría ruido.
compare y mismatch (Java 9+)
Arrays.compare(a, b) devuelve negativo, cero o positivo — orden lexicográfico sobre los elementos:
int[] a = {1, 2, 3};
int[] b = {1, 2, 4};
int cmp = Arrays.compare(a, b); // negative — a is smallerArrays.mismatch(a, b) devuelve el índice del primer elemento diferente, o -1 si son iguales:
int diff = Arrays.mismatch(a, b); // 2Cuando un array es un prefijo propio del otro, el más corto se considera "menor" por compare, y mismatch devuelve la longitud del array más corto:
int[] s = {1, 2};
int[] l = {1, 2, 3};
Arrays.compare(s, l); // negative — s is a prefix, so it sorts first
Arrays.mismatch(s, l); // 2 — they agree up to index 2, then s runs outEstos son útiles cuando necesitas orden o "en qué punto divergieron" sin escribir el bucle a mano.
Errores comunes
Algunas trampas son lo suficientemente frecuentes como para listarlas en un solo lugar:
==no es comparación de contenido.a == bestruesolo cuando ambos nombres apuntan al mismo objeto array. UsaArrays.equals(oArrays.deepEqualspara arrays anidados) para comparar contenidos.toStringes superficial.Arrays.toString(grid)sobre unint[][]imprime algo como[[I@1b6d3586, ...]— los arrays internos usan suObject.toStringpredeterminado. UsaArrays.deepToStringsiempre que un array contenga otros arrays.asListcon un array primitivo te sorprende.Arrays.asList(new int[]{1, 2, 3})es unaList<int[]>de un elemento, no unaList<Integer>de longitud tres, porqueint[]es un único objeto. UsaArrays.stream(arr).boxed().toList()(Java 16+) para obtener la lista que querías.asListes de tamaño fijo. Es una vista sobre el array original, por lo quesetfunciona peroaddyremovelanzanUnsupportedOperationException. Envuélvelo ennew ArrayList<>(Arrays.asList(...))si necesitas hacerlo crecer.binarySearchnecesita un array ordenado. Con entrada sin ordenar, el resultado es indefinido — no lanza excepción, simplemente devuelve un índice incorrecto. Ordena primero.
Un ejemplo completo
La demo siguiente combina la mayoría de los métodos. Ejecútala y compara la salida con los comentarios anteriores — binarySearch devuelve 5 para el valor 5, el resultado negativo para un elemento no presente, y la lista [red, green, blue] de asList:
Qué sigue
Hemos usado Arrays.sort solo de pasada. El siguiente capítulo, Ordenar arrays, profundiza en cómo funciona la ordenación para primitivos frente a objetos, ascendente frente a descendente, y cómo ordenar con tus propios criterios usando un Comparator.