Matriz de objetos en Java
⚡ Resumen inteligente
Matriz de objetos en Java Almacena referencias a objetos en una ranura contigua de tamaño fijo, lo que permite que una sola variable contenga muchas instancias de una clase y que se acceda a cada una de ellas mediante un índice para su iteración, modificación y paso a métodos.
¿Qué es un array de objetos en Java?
A Java conjunto de objetos almacena múltiples instancias de objetos de la misma clase en un único contenedor de tamaño fijo. A diferencia de un array primitivo que almacena valores como int, double, o boolean directamente en cada ranura, una matriz de objetos almacena referenciasCada ranura apunta a la ubicación de memoria de un objeto, y el objeto mismo reside en la Java montón.
Este diseño coincide con la forma en que cualquier objeto variable in Java Funciona. El array simplemente agrupa varias referencias a objetos para que puedas acceder a ellas por índice. Es la opción más lógica cuando se conoce de antemano el número de objetos y este no cambia durante la ejecución del programa.
Sintaxis
ClassName[] obj = new ClassName[array_length];
El lado derecho asigna espacio para array_length referencias, todas inicializadas a null. Ningún objeto de ClassName Sin embargo, solo existe el contenedor que puede almacenar referencias a dichos objetos.
Cómo crear una matriz de objetos en Java
La creación de un array de objetos funcional siempre requiere dos pasos de asignación. El primero asigna el contenedor de referencia y el segundo asigna cada objeto al que apuntará dicho contenedor.ping El segundo paso es la fuente más común de NullPointerException en principiante Java código.
Paso 1) Abra su Editor de código y copie el siguiente código:
class ObjectArray { public static void main(String args[]) { Account obj[] = new Account[2]; // obj[0] = new Account(); // obj[1] = new Account(); obj[0].setData(1, 2); obj[1].setData(3, 4); System.out.println("For Array Element 0"); obj[0].showData(); System.out.println("For Array Element 1"); obj[1].showData(); } } class Account { int a; int b; public void setData(int c, int d) { a = c; b = d; } public void showData() { System.out.println("Value of a = " + a); System.out.println("Value of b = " + b); } }
Paso 2) Guarde el archivo como ObjectArray.java, luego compílelo y ejecútelo.
Paso 3) Observa el error. Intenta depurarlo antes de continuar con el paso 4.
Paso 4) Inspeccionar la línea Account obj[] = new Account[2];. Asigna una matriz de dos variables de referencia de tipo Accountpero no asigna ninguna Account objetos. Ambas ranuras contienen nully llamando obj[0].setData(...) en un null la referencia arroja un NullPointerException en tiempo de ejecución.
Paso 5) Descomente las líneas 4 y 5. Estas dos líneas crean realmente Account objetos y asignarlos a obj[0] y obj[1]Ahora el array contiene referencias reales y el código se ejecuta sin problemas.
Salida:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Cómo inicializar una matriz de objetos en Java
Más allá de la inicialización mediante setter mostrada anteriormente, un array de objetos se puede inicializar de tres maneras más elegantes. Cada estilo prioriza la claridad sobre la verbosidad, así que elige el que mejor se adapte a la situación.
- Inicialización del bucle — Asigna memoria al array, recorre cada índice y asigna un nuevo objeto. Este es el patrón estándar para arrays grandes o cuando la cantidad de objetos es dinámica.
- Inicialización del constructor — Pasar los valores directamente al constructor en el momento de la creación, de modo que no sea necesaria una llamada a un método setter por separado.
- Inicialización literal de matriz — declarar y rellenar en una sola instrucción con una línea
{ ... }Inicializador, ideal para conjuntos pequeños y fijos.
class Account { int a, b; public Account(int a, int b) { // constructor this.a = a; this.b = b; } } public class InitDemo { public static void main(String[] args) { // 1) Loop initialisation Account[] loopArr = new Account[3]; for (int i = 0; i < loopArr.length; i++) { loopArr[i] = new Account(i, i * 10); } // 2) Constructor initialisation, one slot at a time Account[] ctorArr = new Account[2]; ctorArr[0] = new Account(1, 2); ctorArr[1] = new Account(3, 4); // 3) Array literal initialisation Account[] litArr = { new Account(5, 6), new Account(7, 8), new Account(9, 10) }; System.out.println("loop size = " + loopArr.length); System.out.println("ctor size = " + ctorArr.length); System.out.println("literal size= " + litArr.length); } }
La inicialización en bucle es la opción predeterminada más segura porque garantiza que no quede ninguna ranura. nullLa inicialización del constructor hace explícita la intención cuando cada objeto necesita argumentos diferentes, y los literales de array mantienen el código de demostración compacto. No mezcle estilos dentro del mismo array a menos que tenga una razón: la coherencia facilita la detección de errores.
Iterar y acceder a elementos en un Java Matriz de objetos
Una vez que se ha rellenado un array de objetos, tres patrones cubren prácticamente todas las necesidades de acceso. Elija el estilo de bucle que mejor se adapte al nivel de control que el código necesita sobre el índice.
Clásica for loops Permite acceder al índice, lo cual resulta útil para reemplazar elementos, comparar vecinos o iterar sobre un subrango.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Mejorado for loops (el bucle “for-each”) oculta el índice y se lee de forma más natural cuando no se necesita el índice:
for (Account acc : obj) {
acc.showData();
}
Corrientes (Java 8 y posteriores) convertir el array en una tubería, lo cual es útil para filtrar, mapearpingo agregando sin escribir un bucle:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Para leer o actualizar un solo elemento, utilice el acceso directo al índice, por ejemplo obj[1].setData(10, 20). Siempre compruebe primero la longitud con obj.length para evitar ArrayIndexOutOfBoundsException. Cuando cualquier ranura podría ser null, proteja el acceso con una comprobación nula o una Optional para que el programa siga funcionando en lugar de bloquearse.
Matriz de objetos frente a ArrayList de objetos en Java
Una matriz simple de objetos es rápida y predecible, pero su tamaño fijo se convierte en una limitación tan pronto como cambia la cantidad de objetos en tiempo de ejecución. JavaEl marco de colecciones de proporciona ArrayList como alternativa dinámica. La siguiente tabla destaca cuándo es apropiada cada opción.
| Elemento | Matriz de objetos | Lista de objetos |
|---|---|---|
| Tamaño | Corregido en el momento de la creación | Crece y se encoge automáticamente |
| Declaración | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Elemento de acceso | a[i] | list.get(i) |
| Agregar elemento | No se admite después de su creación. | list.add(obj) |
| Tipo de seguridad | Tipado en tiempo de compilación mediante declaración | Los genéricos se aplican en tiempo de compilación. |
| Rendimiento | Lecturas indexadas ligeramente más rápidas | Amortizado O(1) añadido, algunos gastos generales por elemento |
| Preferido cuando | El tamaño es conocido y fijo. | El tamaño es desconocido o cambia en tiempo de ejecución. |
Utilice una matriz cuando el uso de memoria sea limitado y la indexación predecible sea importante, por ejemplo, en diseños de matriz o rutas críticas para el rendimiento. ArrayList En la mayoría del código de las aplicaciones cotidianas, porque la capacidad de agregar y eliminar sin reasignar memoria compensa la pequeña sobrecarga por elemento.



