У меня есть функция, которая управляет очень большим списком, превышающим около 250 000 элементов. Для большинства этих элементов он просто заменяет элемент в позиции x. Однако около 5% из них должны удалить их из списка.
Использование LinkedList, казалось, было наиболее очевидным решением, чтобы избежать дорогостоящих изъятий. Однако, естественно, доступ к LinkedList по индексу становится все медленнее с течением времени. Стоимость здесь - минуты (и многие из них).
Использование Iterator над этим LinkedList также дорого, поскольку мне кажется, что требуется отдельная копия, чтобы избежать проблем с Iterator concurrency при редактировании этого списка. Стоимость здесь минут.
Однако здесь, где мой ум немного взорван. Если я перехожу в ArrayList, он запускается почти мгновенно.
Для списка с 297515 элементами удаление 11958 элементов и изменение всего остального занимает 909 мс. Я подтвердил, что получившийся список действительно имеет размер 285557, как и ожидалось, и содержит обновленную информацию, которая мне нужна.
Почему это так быстро? Я посмотрел на источник для ArrayList в JDK6, и он, похоже, использует функцию arraycopy, как ожидалось. Я хотел бы понять, почему ArrayList работает так хорошо, когда здравый смысл, похоже, указывает на то, что массив для этой задачи - ужасная идея, требующая смещения нескольких сотен тысяч элементов.