Сначала вам нужно подумать, удалитесь ли вы из центра списка часто по сравнению с длиной списка.Если в вашем списке есть N
элементов, но вы удаляете их гораздо реже, чем 1/N
, не беспокойтесь об этом.Используйте LinkedList
или ArrayDeque
по своему усмотрению.(Если ваши списки иногда бывают огромными, а затем уменьшаются, но в основном маленькие, лучше использовать LinkedList
, так как легко восстановить память; в противном случае ArrayDeque
не нужны дополнительные объекты, поэтому он немного быстрее и компактнее.- за исключением того, что базовый массив никогда не сжимается.)
Если, с другой стороны, вы удаляете немного чаще, чем 1/N
, то вам следует рассмотреть LinkedHashSet
, который поддерживает очередь связанного списка наначало хеш-набора - но это - это набор, поэтому имейте в виду, что вы не можете хранить дубликаты элементов.Это накладные расходы LinkedList
и ArrayDeque
, вместе взятые, но если вы часто делаете центральное удаление, это, вероятно, того стоит.
Оптимальная структура, однако - если вам действительно нужнокаждая последняя унция скорости и готовы тратить время на кодирование, чтобы получить его - это будет массив «изменяемого размера» (то есть перераспределяемый, когда он был слишком мал) с круговым буфером, где вы можете убрать элементы из середины, установив ихк нулю.(Вы могли бы также перераспределить буфер, когда слишком много было пусто, если у вас был неправильный вариант использования.) Я не советую кодировать это, если вы действительно не любите кодировать высокопроизводительные структуры данных или не имеете убедительных доказательств того, что это один изключевые узкие места в вашем коде, и поэтому вам это действительно нужно.