Чтобы выполнить итерацию по связанному списку, нужно следовать по каждой ссылке (ссылке) в каждом элементе. Эти ссылки могут указывать почти везде, нет никакой гарантии, что следующий элемент следует за текущим в памяти, что плохо для кэширования. Поскольку каждая ссылка должна быть восстановлена, она медленнее.
Массивы непрерывны в памяти, а следующий элемент - это просто область памяти текущего элемента, увеличенная с увеличением размера элемента.
Для двусвязного списка вставка в любом месте массива происходит очень быстро, потому что нужно изменить только ссылки на предыдущий и следующий элемент. Массив, с другой стороны, медленнее, потому что вставка в любой точке приведет к тому, что весь массив будет скопирован, чтобы освободить место для нового элемента. Даже добавление элемента также приведет к тому, что весь массив будет скопирован, когда для массива будет выделено недостаточно непрерывной памяти плюс добавленный элемент.
Вы особенно заметите различия при вставке при работе с большими наборами данных. Независимо от того, насколько быстрым может быть arraycopy()
, двунаправленный список всегда быстрее для вставки. Поскольку HashMaps редко повторяются и зависят от вставки и порядка, двусвязный список может повысить производительность.