Во-первых: Должно быть что-то не так с вашим тестом: ArrayList удаляет элементы намного медленнее, чем добавляет некоторые.Это связано с тем, что в массиве не должно быть пробелов в нижележащем массиве.Поэтому элементы должны быть смещены, если вы удалите их везде, но в конце.
Этот ответ зависит от того, хотите ли вы удалить на основе индекса или значения.В целом, операции на основе индексов выполняются быстрее, поскольку не требуется проводить обширные сравнения значений.Поскольку, если вы хотите удалить элементы, вы должны были добавить их один раз, поэтому полезно учитывать сложность добавления:
- ArrayList: Add: O (n), амортизированный O(1) (на практике дешево).Удалить всегда O (n), Найти O (1), если основано на индексе, O (n), если основано на значении
Практический пример эффекта амортизированного анализа: добавление одного миллиона элементов вСтрока приведет к 10 миллионам копий.Однако количество копий равно O (log n), n - количество последовательных операций добавления.
- LinkedList Добавить: в среднем O (n), AddFirst / Last O (1), removeLast / First O (1), найти O (n), getFirstElement / GetLastElementO (1).Обратите внимание: вы должны знать, что искомый элемент находится в конце / начале, и вызывать соответствующий метод.
Пока у вас много последовательных операций добавления / удаления иНесколько поисковых операций (кроме получения первого или последнего элемента), я рекомендую вам использовать LinkedList .
Если у вас нет двух одинаковых объектов, то есть (Object.equals(sameObject)
) возвращает true
точно для того же объекта.Вы должны использовать LinkedHashSet Он имеет O (1) для всех операций, но одинаковые объекты могут содержаться только один раз.К сожалению, поиск по индексу здесь невозможен, методы также не синхронизированы.Но всегда есть компромисс.
Некоторая теория: Согласно упомянутым работам здесь , мы не можем сделать лучше, чем амортизированная Омега (log n) для произвольного добавления и удаления элементов.