Здесь есть много ответов - проблема, как я понимаю, состоит в том, что вы не сказали, ПОЧЕМУ вы используете массив вместо коллекции, поэтому позвольте мне предложить пару причин и какие решения будут применяться (Большинство Ответы на другие вопросы уже даны здесь, поэтому я не буду вдаваться в подробности):
причина: вы не знали, что пакет сбора существует, или не доверяли ему
решение: использовать коллекцию.
Если вы планируете добавлять / удалять из середины, используйте LinkedList. Если вы действительно беспокоитесь о размере или часто индексируете прямо в середине коллекции, используйте ArrayList. У обоих из них должны быть операции удаления.
причина: Вы обеспокоены размером или хотите контролировать выделение памяти
решение: используйте ArrayList с определенным начальным размером.
ArrayList - это просто массив, который может расширяться, но это не всегда нужно делать. Он будет очень умным при добавлении / удалении элементов, но опять же, если вы вставляете / удаляете LOT из середины, используйте LinkedList.
причина: у вас есть входящий массив и выходящий массив - поэтому вы хотите работать с массивом
решение: преобразовать его в ArrayList, удалить элемент и преобразовать обратно
причина: вы думаете, что можете написать лучший код, если вы сделаете это самостоятельно
решение: вы не можете использовать массив или связанный список.
причина: это назначение класса, и вам запрещено или у вас нет доступа к коллекции apis по какой-то причине
допущение: новый массив должен иметь правильный размер
решение:
Сканируйте массив на предмет соответствия и подсчитайте их. Создайте новый массив правильного размера (оригинальный размер - количество совпадений). используйте System.arraycopy несколько раз, чтобы скопировать каждую группу элементов, которые вы хотите сохранить, в свой новый массив. Если это назначение класса, и вы не можете использовать System.arraycopy, просто скопируйте их по одному вручную в цикле, но никогда не делайте этого в производственном коде, потому что это намного медленнее. (Оба решения подробно описаны в других ответах)
причина: вам нужно запустить голый металл
предположение: вы НЕ ДОЛЖНЫ распределять пространство без необходимости или занимает слишком много времени
допущение: вы отслеживаете размер, используемый в массиве (длину) отдельно, потому что в противном случае вам пришлось бы перераспределить массив для удаления / вставки.
Пример того, почему вы можете захотеть сделать это: один массив примитивов (скажем, значения int) занимает значительную часть вашего барана - например, 50%! ArrayList вынуждает их составлять список указателей на объекты Integer, которые будут использовать в несколько раз больше памяти.
решение: перебирайте массив, и всякий раз, когда вы найдете удаляемый элемент (назовем его элементом n), используйте System.arraycopy, чтобы скопировать хвост массива поверх «удаленного» элемента (Source и Destination - это один и тот же массив) - он достаточно умен, чтобы сделать копию в правильном направлении, чтобы память не перезаписывала себя:
System.arraycopy(ary, n+1, ary, n, length-n)
length--;
Возможно, вы захотите быть умнее этого, если удаляете более одного элемента одновременно. Вы должны перемещать область между одним «матчем» и следующим, а не всем хвостом, и, как всегда, избегать перемещения любого куска дважды.
В этом последнем случае вы обязательно должны выполнить работу самостоятельно, и использование System.arraycopy на самом деле является единственным способом сделать это, поскольку он выберет наилучший из возможных способов перемещения памяти для архитектуры вашего компьютера - это должно быть во много раз быстрее любого кода, который вы могли бы написать самостоятельно.