Подписаться на хаб

Java

Клуб Java разработчиков
В закладки
382
0
3

Записки программиста #1, лучше чаще использовать LinkedList

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

Все мы наверное по дефолту в своем коде используем ArrayList<E>, вроде логично, просто массив, в большинстве случаев даже работает быстро. Я с этим соглашусь. Но я думаю что есть вариант получше, использовать LinkedList<E>. Сейчас объясню почему.

Каждый уважающий себя разработчик знает чем отличается ArrayList<E> от LinkedList<E>, но на всякий случай повторю:

ArrayList<E> - список основанный на массиве, как мы знаем, массивы у нас фиксированного размера и когда мы выходим за границы массива, то ArrayList<E> будет расширяться через копирование внутренного массива в новый, кратковременно в памяти будет существовать два почти одинаковых массива, но потом первый соберется. В этой коллекции все ок, кроме небольшого оверхеда на расширение при выходе за границы.

LinkedList<E> - связанный список, в основе лежат объекты и связи между ними, нет массива. Нет оверхеда на расширение, но не возможен доступ по индексу, то есть если мы в ArrayList<E> вызовем метод .get(1) например, эта операция будет иметь сложность O(1), но если мы сделаем тоже самое на LinkedList<E> то эта операция уже будет занимать O(N), так как LinkedList<E> не поддерживает RandomAccess. Но давайте подумаем об основном паттерне работы со списками?

Обычно мы создаем ArrayList<E>, пишем в него данные, откуда-то возвращаем, а потом читаем весь список (очень редко когда мы получаем что-то по индексу)

Так представим на минуточку, что если мы будем писать много данных? Сколько придется расширяться ArrayList<E> и копировать свой внутренний массив? От этого оверхеда можно избавиться использовав LinkedList<E>, в этом и есть мой паттерн... Используйте LinkedList<E>, когда вы только пишите и не читаете значения по индексу. Тогда Ваш код станет чуточку быстрее.

UPD

Но если для вас критична память, а не скорость, то лучше использовать ArrayList<E>, так как он занимает меньше места

0 ответов