Hay muchas respuestas aquí; el problema, tal como lo veo, es que no dijo POR QUÉ está usando una matriz en lugar de una colección, así que permítame sugerir un par de razones y qué soluciones se aplicarían (la mayoría de las soluciones ya han sido respondidas en otras preguntas aquí, por lo que no entraré en demasiados detalles):
motivo: no sabía que existía el paquete de colección o no confiaba en él
solución: Utilice una colección.
Si planea agregar / eliminar desde el medio, use una LinkedList. Si está realmente preocupado por el tamaño o, a menudo, indexa directamente en el medio de la colección, use una ArrayList. Ambos deberían tener operaciones de eliminación.
motivo: le preocupa el tamaño o desea controlar la asignación de memoria
solución: use una ArrayList con un tamaño inicial específico.
Una ArrayList es simplemente una matriz que se puede expandir, pero no siempre es necesario que lo haga. Será muy inteligente agregar / eliminar elementos, pero nuevamente si está insertando / eliminando MUCHO del medio, use una LinkedList.
motivo: tiene una matriz entrando y una matriz saliendo, por lo que desea operar en una matriz
solución: conviértalo en un ArrayList, elimine el elemento y conviértalo de nuevo
motivo: cree que puede escribir un código mejor si lo hace usted mismo
solución: no puede, use una matriz o una lista vinculada.
motivo: esta es una tarea de clase y no está permitido o no tiene acceso a las apis de la colección por algún motivo
suposición: necesita que la nueva matriz tenga el "tamaño" correcto
solución: escanee la matriz en busca de elementos coincidentes y cuéntelos. Cree una nueva matriz del tamaño correcto (tamaño original - número de coincidencias). use System.arraycopy repetidamente para copiar cada grupo de elementos que desea retener en su nueva matriz. Si esta es una asignación de clase y no puede usar System.arraycopy, simplemente cópielos uno a la vez a mano en un bucle, pero nunca lo haga en el código de producción porque es mucho más lento. (Estas soluciones se detallan en otras respuestas)
motivo: necesitas ejecutar bare metal
suposición: no DEBE asignar espacio innecesariamente o tomar demasiado tiempo
suposición: está rastreando el tamaño utilizado en la matriz (longitud) por separado porque, de lo contrario, tendría que reasignar su matriz para eliminaciones / inserciones.
Un ejemplo de por qué es posible que desee hacer esto: una sola matriz de primitivas (digamos valores int) está tomando una parte significativa de su RAM, ¡como el 50%! Un ArrayList los forzaría en una lista de punteros a objetos Integer que usarían unas pocas veces esa cantidad de memoria.
solución: Itere sobre su matriz y cada vez que encuentre un elemento para eliminar (llamémoslo elemento n), use System.arraycopy para copiar la cola de la matriz sobre el elemento "eliminado" (la fuente y el destino son la misma matriz): es lo suficientemente inteligente como para hacer la copia en la dirección correcta para que la memoria no se sobrescriba a sí misma:
System.arraycopy (ary, n + 1, ary, n, longitud-n)
longitud--;
Probablemente querrá ser más inteligente que esto si está eliminando más de un elemento a la vez. Solo movería el área entre una "coincidencia" y la siguiente en lugar de toda la cola y, como siempre, evite mover cualquier trozo dos veces.
En este último caso, debe hacer el trabajo usted mismo, y usar System.arraycopy es realmente la única forma de hacerlo, ya que elegirá la mejor forma posible de mover la memoria para la arquitectura de su computadora; debería ser muchas veces más rápido que cualquier código que pueda escribir usted mismo.