Java как удалить массив из памяти

Обновлено: 06.07.2024

Есть ли какой-нибудь быстрый (и красивый) способ удалить элемент из массива в Java?

ОТВЕТЫ

Ответ 1

Вы можете использовать commons lang ArrayUtils.

Ответ 2

Ваш вопрос не очень ясен. Из вашего собственного ответа я могу лучше сказать, что вы пытаетесь сделать:

Примечание. Это не проверено. Проверка ошибок оставлена ​​как упражнение для читателя (я бы выбрал IllegalArgumentException, если ввод или deleteMe равен NULL, пустой список для ввода нулевого списка не имеет смысла. Удаление нулей Строки из массива могут иметь смысл, оставим это как упражнение тоже, в настоящее время он будет бросать NPE, когда он пытается называть equals на deleteMe, если deleteMe имеет значение null.)

Выбор, который я сделал здесь:

Я использовал LinkedList. Итерация должна быть такой же быстрой, и вы избегаете любых изменений или выделяете слишком большой список, если в итоге вы удалите множество элементов. Вы можете использовать ArrayList и установить начальный размер на длину ввода. Вероятно, это не будет иметь большого значения.

Ответ 3

Наилучшим выбором будет использование коллекции, но если по какой-то причине этого нет, используйте arraycopy . Вы можете использовать его для копирования из одного и того же массива в несколько другое смещение.

Изменить в ответ на комментарий:

Это не другой хороший способ, это действительно единственный приемлемый способ - любые инструменты, которые позволяют эту функциональность (такие как Java.ArrayList или утилиты apache), будут использовать этот метод под прикрытием. Кроме того, вы ДЕЙСТВИТЕЛЬНО должны использовать ArrayList (или связанный список, если вы много удаляете из середины), так что это не должно быть проблемой, если вы не делаете это в качестве домашней работы.

Чтобы выделить коллекцию (создает новый массив), затем удалить элемент (который коллекция будет делать с помощью arraycopy), а затем вызвать toArray для него (создает ВТОРОЙ новый массив) для каждого удаления, что приводит нас к точке, где это не является проблемой оптимизации, это преступно плохое программирование.

Предположим, у вас есть массив, занимающий, скажем, 100 МБ ОЗУ. Теперь вы хотите перебрать его и удалить 20 элементов.

Я знаю, что вы ПРИНИМАЕТЕ, что он не будет таким большим или что, если вы удаляете столько раз за раз, вы закодируете его по-другому, но я исправил очень много кода, где кто-то делал подобные предположения.

Ответ 4

Вы не можете удалить элемент из базового массива Java. Взгляните на различные коллекции и ArrayList.

Ответ 5

Хорошим решением будет использовать List вместо массива, в первую очередь.

Если вам нужно использовать массивы, наиболее вероятными могут быть два вызова System.arraycopy .

( Arrays.asList также является хорошим кандидатом для работы с массивами, но он, похоже, не поддерживает remove .)

Ответ 6

Я думаю, что вопрос требует разрешения без использования API коллекций. Один использует массивы либо для деталей низкого уровня, где важна производительность, либо для слабосвязанной интеграции SOA. В более поздних версиях, это нормально, чтобы преобразовать их в Коллекции и передать их бизнес-логике как таковой.

Для низкоуровневого уровня производительности он обычно уже запутывается быстрым и грязным императивным сочетанием состояний для циклов и т.д. В этом случае преобразование между коллекциями и массивами является громоздким, нечитаемым и даже ресурсоемкий.

Ниже моя интерпретация проблемы и решение. Он отличается по функциональности от тех, которые заданы Bill K и jelovirt. Кроме того, он грамотно обрабатывает случай, когда элемент не находится в массиве.

Надеюсь, что это поможет!

Ответ 7

Вы можете использовать ArrayUtils API, чтобы удалить его "красивым способом". Он реализует множество операций (удалить, найти, добавить, содержит и т.д.) На массивы.
Взглянуть. Это упростило мою жизнь.

Ответ 8

Для Билла К и Дадинна требуются дополнительные предварительные условия

Ответ 9

Вы не можете изменить длину массива, но вы можете изменить значения индекса, скопировав новые значения и сохранив их под существующим индексным номером. 1 = Майк, 2 = Джефф //10 = Джордж 11 переходит на 1 перезаписывая Майк.

Ответ 10

в порядке, спасибо много теперь я использую sth, как это:

Ответ 11

Надеюсь, вы используете коллекцию java collection/java commons!

С помощью java.util.ArrayList вы можете сделать следующее:

Ответ 12

Copy ваш исходный массив в другой массив без элемента, который нужно удалить.

Более простой способ сделать это - использовать List, Set. и использовать метод remove().

Ответ 13

Смените элемент, который нужно удалить, с последним элементом, если изменение размера массива не представляет интереса.

Массив в Java - это набор элементов одного типа фиксированного размера. Java предоставляет различные методы для выполнения различных манипуляций, связанных с массивом.

Используйте цикл for для удаления элемента из массива и сдвига в Java

В этом подходе мы используем несколько циклов for , чтобы перебирать все элементы arr и проверять элемент, который мы хотим удалить. Когда удаляемый элемент найден, мы создаем новый массив newArr размером arr.length-1 . Мы запускаем еще один цикл, чтобы скопировать все элементы перед индексом, в котором находится elementToBeDeleted .

После этого мы запускаем еще один цикл, чтобы скопировать оставшиеся элементы массива после elementToBeDeleted , оставив тот, который мы должны удалить.

Используйте System.arraycopy() для удаления элемента из массива и сдвига в Java

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) копирует исходный массив в целевой массив, начиная действие копирования с позиции источника в позицию назначения до заданной длины. .

Здесь мы передаем наш исходный массив arr методу removeElement , который запускает два метода System.copy() . Мы создаем arrDestination длиной на 1 меньше, чем длина arr при удалении одного элемента.

Сначала мы копируем элементы перед индексом 2 , так как нам нужно удалить 6 из arr . Затем получите оставшиеся элементы, которые существуют после индекса элемента, который мы намеревались удалить.

Используйте ArrayList для удаления элемента из массива и сдвига в Java

Мы можем преобразовать Array в ArrayList , чтобы удалить элемент из массива, и перетасовка будет выполняться самим ArrayList .

В приведенном ниже коде мы создаем массив объектов Integer arr . Затем мы передаем массив и индекс удаляемого элемента методу removeElementUsingCollection , который управляет массивом и возвращает массив объектов.

Переданный массив преобразуется в ArrayList tempList , и вызов метода remove() удаляет элемент по указанному индексу из списка. Он возвращает список, преобразованный обратно в массив.

Сопутствующая статья - Java Array

Массив - это коллекция, в которой могут храниться элементы схожих типов с назначенным им фиксированным местоположением в памяти. Массив также позволяет хранить повторяющиеся значения.

Это руководство продемонстрирует, как эффективно удалять дубликаты из массива в Java различными способами.

Использование временного массива для удаления дубликатов из массива в Java

В этом методе основная цель - пройти по входному массиву, а затем скопировать уникальные элементы из исходного массива во временный. Для этого мы будем использовать цикл for и оператор if . Наконец, элементы из временного массива копируются в исходный массив, и мы его печатаем.

Обратите внимание, что мы можем реализовать указанную выше программу только на отсортированных массивах.

Использование отдельного индекса для удаления дубликатов из массива в Java

Здесь оператор if используется для проверки, равен ли элемент своему следующему элементу. Если нет, то этот конкретный элемент добавляется только по некоторому индексу в этом аналогичном массиве. Это сделано для того, чтобы показать, что в массив этот конкретный элемент добавляется только один раз.

Этот метод также применим только в том случае, если массив отсортирован.

Мы реализуем это в следующем фрагменте кода.

Используйте метод Arrays.sort() для удаления дубликатов из массива в Java

Функция Arrays.sort() умеет сортировать массивы в Java. Этот метод используется не только для связанных списков, списков массивов и т. Д., Но мы также можем использовать его для примитивных типов данных.

Если мы используем этот метод, временная и пространственная сложность не фиксируется. Это полностью зависит от реализации кода.

Как было замечено, повторяющиеся элементы из несортированных массивов также удаляются таким же образом, как и отсортированные массивы. Но здесь используется еще один метод для сортировки несортированного массива.

Следует отметить, что следует проверить, отсортирован ли массив или нет, а затем перейти к следующему шагу по удалению дубликатов.

Сопутствующая статья - Java Array

Массив в Java – это набор элементов одного типа, обратиться к которым можно по индексу.

Элементы массивов в Java расположены друг за другом в памяти компьютера. Ниже разбирается пример массива в Java.

Объявление массива в Java

Объявим массив, для хранения элементов типа int:

Здесь объявлена переменная arr, которая является массивом. Чтоб использовать эту переменную нужно её определить.

Определение массива в Java

Для определения массива в Java следует указать его длину, т.е. количество элементов, которые могут в нём храниться:

В нашем массиве бедет храниться 5 элементов.

Массив — это набор элементов. К каждому элементу массива можно обратиться по его номеру. Номер принято называть индексом. Нумерация элементов массива в Java идёт с нуля.

Как загрузить элементы в массив?

Присвоим значение первому элементу массива, а первый элемент имеет индекс ноль:

Присвоим значение второму элементу массива, а второй элемент имеет индекс один:

и так далее. Обычно это делают в цикле:

Можно при объявлении массива сразу загрузить в него значения:

количество элементов здесь равно 5-ти, т.е. нет необходимости указать число элементов, оно будет определено автоматически.

Как получить элементы из массива?

К каждому элементу массива можно обратиться по его номеру. Чтоб получить элемент массива, надо указать имя массива и индекс элемента:

это первый элемент массива, ведь у первого элемета индекс ноль.

Присвоим значение третьего элемента массива переменной int a:

Выведем в цикле все элементы массива (переберем массив):

Упрощенный вариант цикла для вывода массива таков:

Как удалить массив в Java?

Удалить массив в Java можно так:

Как получить длину массива в Java?

Длину массива в Java получаем так:

Как получить первый элемент массива в Java?

Как получить полследний элемент массива в Java?

Как в Java задать массив переменной длины?

Как в Java задать массив переменной длины? Никак. Когда вы определяете массив, тогда и задаёте его длину, изменить её в дальнейшем нельзя. В таких случаях используют коллекции, например: Vector, ArrayList и др.

Итак, перемнной длина массива быть не может. Но можно использовать переменную при определении массива. Если так:

то получим ошибку, длина массива не может быть переменной.

Надо задать значение cd:

Теперь нормально. Если после определения массива изменить переменную cd, то это не повлияет на массив, т.е. его длина не изменится. Пример:

Максимальный индекс нашего массива равен 9-ти. Изменение значения переменной cd не влияет на массив, ведь он уже определен и его длина есть константа.

Переменные можно использовать для обращения к элементам массива:

Массив символов в Java

Пример массива символов в Java и его вывода:

Как заполнить массив в Java?

Заполнить массив можно с помощью статического метода fill:

newArr[0] = 5; newArr[1] = 5; newArr[2] = 5; newArr[3] = 5; newArr[4] = 5;

Как отсортировать массив в Java?

Пример сортировки массива в Java:

Статическая функция sort сортирует элементы массива в порядке возрастания.

Пример сортировки массив, Java

Получаем:

Мне 4 дня на Java, и из учебных пособий, которые я искал, инструкторы сосредоточили много усилий на объяснении, как выделить двумерный массив (например) следующим образом:

. но я не нашел ничего, что объясняет, как их удалить.

Исходя из того, что происходит с памятью, переменная fooArray будет указывать на блок памяти в куче, в котором есть 2 элемента. Каждый из элементов также указывает на другой блок в куче, который имеет 3 элемента.

При этом я могу просто сослаться на первый блок элементов, и сборщик мусора выполнит эту работу?

Foo[1] = null; и Foo[2] = null;

Или мне нужно обнулить каждый из созданных элементов Foo?

Foo[1][1] = null; Foo[1][2] = null; Foo[1][3] = null; .

ОТВЕТЫ

Ответ 1

объяснение

Вы не можете явно удалить что-то в Java. Это работа сборщиков мусора, чтобы сделать это. Он удалит все, что больше никому не используется. Так что либо

  1. пусть переменная выходит из области видимости или
  2. назначить null
  3. или любой другой экземпляр к нему.

Тогда на экземпляр массива (а также на его подмассивы) больше не ссылаются, и сборщик мусора в конце концов удалит его.

Рекомендации

Чтобы понять, почему переназначение внешнего массива достаточно для удаления внутренних массивов, вам необходимо понять, как на них ссылаются. Опять же, сборщик мусора может удалить все, что недоступно. Итак, давайте посмотрим на массив, такой как:

У нас есть 4 экземпляра массива. Один имеет тип int[][] и три типа int[] . Также у нас есть одна переменная outer . На экземпляры ссылаются следующим образом:

Таким образом, удаляя outer , никто больше не ссылается на int[][] . Сборщик мусора теперь может удалить его. Но это также удаляет все ссылки на внутренние массивы, поэтому сборщик мусора теперь также может их удалять.

Теперь предположим, что вы бы ссылались на один из внутренних массивов другой переменной:

Таким образом, сборщик мусора теперь будет удалять внешний массив int[][] , который также удаляет все ссылки на первый и второй внутренний массив. Но на третий по-прежнему ссылается thirdInner , поэтому после сборки мусора мы имеем:

Ответ 2

В какой-то момент, после того как массив выйдет из области видимости, сборщик мусора освободит память, если на него не будет других ссылок.

Если вы хотите обнулить вашу ссылку до того, как переменная выйдет из области видимости (имейте в виду, что если какой-то другой код имеет эту ссылку, она не будет собирать мусор):

Ответ 3

В отличие от C, Java обеспечивает автоматическую сборку мусора, которая очищает массив для вас, когда он становится недоступным (то есть выходит из области видимости). Если вы хотите, вы можете сделать массив пустым, чтобы область памяти стала недоступной.

Этот вызов gc не гарантирует, что JVM запустит сборщик мусора, но предполагает, что виртуальная машина Java затрачивает усилия на утилизацию неиспользуемых объектов, чтобы сделать доступной память, которую они занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить пространство от всех отброшенных объектов

Читайте также: