Чем отличается linkedlist от arraylist java

Кофе-брейк #129. В чем разница между LinkedList и ArrayList? Новые функции, которые появятся в Java 19

Java-университет

Кофе-брейк #129. В чем разница между LinkedList и ArrayList? Новые функции, которые появятся в Java 19 - 1

Источник: Rrtutors.com Если вы новичок в программировании на Java, вам наверняка должно быть интересно, что лучше использовать при работе с коллекциями: LinkedList или ArrayList. Оба этих класса выполняют схожие функции, поэтому иногда бывает трудно решить, какой из них лучше применять в работе. В этой публикации мы определим различия между двумя классами и обсудим, где и когда их стоит использовать.

Разница между ArrayList и LinkedList в Java

Манипуляции

В обоих случаях существует разница в скорости манипулирования массивами. ArrayList медленнее манипулируют массивами, чем LinkedList. Это связано с тем, что LinkedList основан на узлах (node-based) и не требует большого смещения битов.

Доступ

ArrayList быстрее хранят и извлекают данные. С другой стороны, LinkedList поддерживает более быструю обработку данных.

Реализация

ArrayList реализует только список, а LinkedList реализует и список, и очередь. LinkedList также часто используется в качестве очередей.

Внутренняя реализация

В ArrayList элементы хранятся в динамическом массиве, тогда как LinkedList используют двусвязный (doubly-linked) список.

Когда использовать ArrayList и LinkedList?

ArrayList подходит для работы с коллекцией, доступной только для чтения, а LinkedList подходит для работы с коллекцией, допускающей различные модификации данных, такие как добавление и удаление.

Пример LinkedList:

 import java.util.LinkedList; import java.util.List; public class LinkeddExample < public static void main(String[] args) < ListmyGroup=new LinkedList<>(); myGroup.add("Pohekar"); myGroup.add("Sumedh"); myGroup.add("Nikir"); System.out.println("Create Group: "+myGroup); myGroup.remove("Pohekar"); System.out.println("Remove Group element: "+myGroup); myGroup.set(1,"Niha"); System.out.println("Modify Group: "+myGroup); > > 

Пример ArrayList:

 import java.util.ArrayList; import java.util.List; public class ArrayListExca < public static void main(String[] args) < ListPro=new ArrayList<>(); Pro.add("PythonPro"); Pro.add("JavaPro"); Pro.add("C#Pro"); System.out.println("Traversing ArrayList. "); for(String s:Pro) < System.out.println(s); >> > 

JDK 19: новые функции, которые появятся в Java 19

  • Предварительный просмотр шаблонов записей для разбора значений записей. Шаблоны записей и шаблоны типов могут быть вложены друг в друга, чтобы обеспечить декларативную, мощную и компонуемую форму навигации и обработки данных. Идея этой функции состоит в том, чтобы добавить расширение сопоставления шаблонов для выражения более сложных составных запросов данных без изменения синтаксиса или семантики шаблонов типов. Это предложение основано на сопоставлении шаблонов для instanceof, представленном в JDK 16 в марте 2021 года. Далее, в будущих планах может потребоваться расширение шаблонов записей с помощью таких возможностей, как шаблоны массивов и vararg-шаблоны. Запись шаблонов является частью Project Amber, направленного на изучение и развитие небольших функций Java, ориентированных на производительность.
  • Предварительный просмотр чужой функции и API памяти. Он представит API, с помощью которого Java-программы смогут взаимодействовать с кодом и данными вне среды выполнения Java. Благодаря эффективному вызову внешних функций (кода вне среды выполнения Java) и безопасному доступу к внешней памяти (памяти, не управляемой JVM) API позволит программам Java вызывать собственные библиотеки и обрабатывать собственные данные без какой-либо опасности для Java Native Interface (JNI).
  • Предварительный просмотр виртуальных потоков (virtual threads). Это предложение представляет собой облегченные потоки, которые значительно сокращают усилия по написанию, обслуживанию и наблюдению за высокопроизводительными параллельными приложениями. Идея предложения состоит в обеспечении возможности масштабирования серверных приложений, написанных в простом стиле “поток на запрос” (thread-per-request) с оптимальным использованием оборудования. Это позволит внедрять в код, использующий java.langThread API, виртуальные потоки с минимальными изменениями, а также устранять неполадки, выполнять отладку и профилирование виртуальных потоков с помощью существующих инструментов JDK.
  • Третья предварительная версия сопоставления шаблонов для выражений и операторов switch. Она расширяет сопоставление шаблонов (pattern matching) до switch, чтобы позволить тестировать выражение по ряду шаблонов, каждый из которых имеет определенное действие. Благодаря этому сложные запросы, ориентированные на данные, могут быть выражены лаконично и безопасно. Эта функция ранее была предварительно представлена ​​в JDK 17 и JDK 18. В третьей предварительной версии будут добавлены улучшения, включая замену защищенных шаблонов when предложениями в switch-блоках. Идея предложения состоит в расширении выразительности и применимости switch-выражений и операторов.
  • Четвертая инкубация vector API будет выражать векторные вычисления, которые надежно компилируются во время выполнения в оптимальные векторные инструкции на поддерживаемых архитектурах процессоров. Это обеспечит более высокую производительность по сравнению с эквивалентными скалярными вычислениями. Разработчики, использующие новый API, получат возможность писать сложные векторные алгоритмы на Java, используя автовекторизатор HotSpot, но с пользовательской моделью, которая делает векторизацию более предсказуемой и надежной. Векторный API ранее был инкубирован в JDK 16, JDK 17 и JDK 19. В качестве еще одного дополнения к векторному API будут расширены побитовые интегральные lanewide-операции, включая такие операции, как подсчет количества единичных битов, изменение порядка битов на обратный, а также сжатие и расширение битов.
  • С портом Linux/RISC-V язык Java получит поддержку набора аппаратных инструкций, который уже поддерживается широким спектром языковых наборов инструментов. RISC-V представляет собой семейство родственных ISA. Порт Linux/RISC-V будет поддерживать только конфигурацию RV64GV RISC-V, 64-разрядную ISA общего назначения, которая включает векторные инструкции. Порт получит поддержку следующих параметров виртуальной машины HotSpot: интерпретатор шаблонов, JIT-компилятор C1 (клиент), JIT-компилятор C2 (сервер) и все текущие основные сборщики мусора, включая ZGC и Shenandoah.
Читайте также:  Programdata oracle java javapath java exe

Источник

ArrayList vs. LinkedList

— Как насчёт немного размять мозги? Надеюсь, они ещё не закипели.

— В таблице контейнеров и коллекций ты ранее видел, что у одного и того же интерфейса может быть несколько реализаций. Сейчас я расскажу тебе, зачем это нужно. И в чем отличие ArrayList от LinkedList.

— Все дело в том, что коллекции могут быть реализованы разными способами и нет единственного – самого правильного. При одном подходе одни операции являются быстрыми, а остальные медленными, при другом – все наоборот. Нет одного идеального, подходящего всем решения.

— Поэтому было решено сделать несколько реализаций одной и той же коллекции. И каждая реализация была оптимизирована для какого-то узкого набора операций . Так появились разные коллекции. Давай рассмотрим это на примере двух классов – ArrayList и LinkedList.

ArrayList vs. LinkedList - 1

ArrayList реализован внутри в виде обычного массива . Поэтому при вставке элемента в середину, приходится сначала сдвигать на один все элементы после него, а уже затем в освободившееся место вставлять новый элемент. Зато в нем быстро реализованы взятие и изменение элемента – операции get , set , так как в них мы просто обращаемся к соответствующему элементу массива.

LinkedList реализован внутри по-другому. Он реализован в виде связного списка : набора отдельных элементов, каждый из которых хранит ссылку на следующий и предыдущий элементы. Чтобы вставить элемент в середину такого списка, достаточно поменять ссылки его будущих соседей. А вот чтобы получить элемент с номером 130, нужно пройтись последовательно по всем объектам от 0 до 130 . Другими словами операции set и get тут реализованы очень медленно . Посмотри на таблицу:

Описание Операция ArrayList LinkedList
Взятие элемента get Быстро Медленно
Присваивание элемента set Быстро Медленно
Добавление элемента add Быстро Быстро
Вставка элемента add(i, value) Медленно Быстро
Удаление элемента remove Медленно Быстро
Читайте также:  Python check all files in directory

— Ага. Кое-что начинает проясняться. А есть какие-нибудь критерии или правила, когда какая коллекция лучше?

— Ну, для простоты, я бы сформулировала такое правило: если ты собираешься вставлять (или удалять) в середину коллекции много элементов, то тебе лучше использовать LinkedList. Во всех остальных случаях – ArrayList.

— Как они устроены мы разберем в старших уровнях, а пока будем учиться ими пользоваться.

Источник

Оцените статью