Шпаргалка по структурам данных в Java

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

К каждому собеседованию важно готовиться и проще всего это делать, когда перед глазами есть готовый материал. В данной публикации я хочу поделиться с вами своей шпаргалкой, которую использую перед собеседованиями для повторения структур данных в Java.

Что такое структуры данных, для чего они и какие есть в Java?

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

  • Массив

  • Список (Динамический массив)

  • Стек

  • Очередь

  • Связный список

  • HashTable и HashMap

  • Дерево

Массив

Массив - это нумерованный набор переменных одного типа.

Объявляется следующем образом:

int[] arr = new int[10];
  • Все массивы в Java одномерные. В случае с многомерными массивами каждый элемент содержит только ссылку на вложенный массив

  • Можно создать нулевого размера, может быть полезно если нужно вернуть пустой массив из какого-либо метода

  • Оператор new используется для создания ссылочного типа данных. Ссылка хранится на стеке, а объект в куче. Если на объект нет ссылок, то он будет удалён автоматически. Удаление объекта может быть осуществлено с задержкой

Список (Динамический массив)

Идея списка или же динамического массива заключается в автоматическом расширении Емкость - зарезервированное количество элементов.</p><p>Размер - это количество реальных элементов.</p>" data-abbr="емкости">емкости.

Объявляется следующем образом:

ArrayList<Integer> arr = new ArrayList<Integer>();
Плюсы и минусы

Стек

Очередь работает по принципу LIFO. В Java наследуется от Vector<E>, реализует следующие интерфейсы: Iterable<E>, Collection<E>, List<E>, RandomAccess, Serializable, Cloneable.

Объявляется следующем образом:

Stack<Integer> arr = new Stack<Integer>();
Основные методы

Очередь

Интерфейс Queue<E> описывает одностороннюю очередь, а Deque<E> - двухстороннюю. Прежде чем перейти к объявлению в Java, стоит отметить иерархию наследования. Иерархия следующая:

Интерфейсы Queue<E> и Deque<E> реализуют следующие классы:

Объявляется следующем образом:

Queue<Integer> arr = new ArrayDeque<Integer>();
Deque<Integer> arr1 = new ArrayDeque<Integer>();
PriorityQueue<Integer> arr2 = new PriorityQueue<Integer>();
// Очередь на LinkedList'е
Queue<Integer> arr = new LinkedList<Integer>();
Deque<Integer> arr = new LinkedList<Integer>();
Разница между реализацией на листе и деку

Пару слов о PriorityQueue.
Этот класс реализует следующие интерфейсы: Iterable<E>, Collection<E>, Queue<E>, Serializable. У этого класса есть свои особенности:

Связный список

LinkedList<E> реализует связный список, элементы которого хранят ссылки на предыдущий и следующий элементы.

Класс реализует следующие интерфейсы:
Iterable<E>, Collection<E>, List<E>, Queue<E>, Deque<E>, Serializable, Cloneable.

Объявляется следующем образом:

LinkedList<Integer> arr = new LinkedList<Integer>();
Сравнение ArrayList и LinkedList по сложности выполнения операций

Операция

ArrayList

LinkedList

add (E element)

O(1)
O(n) - при копировании

O(1)

add (int index, E element)

O(n/2) - с середины
O(n) - с начала
O(1) - с конца

O(n/4)
O(n) - в конец или начало

remove (int index)

O(n/2) - с середины
O(n) - с начала
O(1) - с конца

O(n/4)
O(n) - в конец или начало

get (int index)

O(1)

O(n/4)

LinkedList занимает гораздо больше памяти, чем ArrayList. Использовать нужно в определенных случаях, чаще всего когда речь идет о двусвязном списке. Также стоит отметить, что элементы у ArrayList в памяти хранятся линейно, поэтому доступ по индексу происходит за O(1)

HashTable и HashMap

HashTable считается устаревшей, поэтому приведена лишь разница между мапой и таблицей. HashMap используется для хранения пары «ключ-значение». В качестве примера использования хэш-мапы можно привести пациента больницы, у которого есть Ф.И.О. и номер медицинского полиса.

Класс HashMap<K, V> реализует следующие интерфейсы:
Map<K, V>, Serializable, Cloneable.

Объявляется следующем образом:

HashMap<String, Integer> map = new HashMap<String, Integer>();
Разница между HashTable и HashMap

Дерево

TreeMap<K, V> и TreeSet<E> описывают словари, в котором ключи хранятся в отсортированном порядке. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов.

Класс TreeSet<E> реализует следующие интерфейсы:
Itearble<E>, Collection<E>, Set<E>, SortedSet<E>, NavigatbleSet<E>, Serializable, Cloneable.

Класс TreeMap<K, V> реализует следующие интерфейсы:
Map<K,V>, SortedMap<K, V>, NavigatbleMap<K, V>, Serializable, Cloneable.

Преимущества иерархической организации данных
Недостатки

Объявляется следующем образом:

TreeSet<Integer> set = new TreeSet<Integer>();
TreeMap<String, Integer> map = new TreeMap<String, Integer>();
В чем разница между HashSet и TreeSet

Заключение

В своей шпаргалке я постарался уделить внимание вопросам, которые быстрее всего забываю. Будет круто увидеть в комментариях замечания, дополнения или же ответы на вопросы, связанные со структурами данных в Java, которые вам задавали на собеседованиях. Надеюсь, что прочитанное было полезно и помогло освежить в памяти знания.


Желаю вам успехов и благодарю за интерес к моей публикации!

Источники

Источник: https://habr.com/ru/articles/751648/


Интересные статьи

Интересные статьи

При разработке приложений регулярно возникает задача кэширования каких-то данных, которые из хранилища должны читаться много чаще, чем писаться. Давайте рассмотрим на примере простого теста, когда и н...
В статье рассмотрен подход, основанный на разбиении структуры приложения на слои и подслои, который позволяет с единой позиции подойти к описанию основных используемых типов архитектуры приложений.
Продолжаем рассказывать аудитории Хабра о возможностях продуктов МойОфис, которые позволяют работать с документами, в том числе совместно, до 30% быстрее. Напомним, что ранее в нашем блоге уже выходил...
По данным Росстта в среднем житель России имеет доход 35 700 ₽ в месяц. Эта цифра мало что говорит о благосостоянии населения. Если взять двух человек — одного с доходом 70 000 ₽ и 1400 ₽, их средний ...
Переходя от проекта к проекту, мы сталкиваемся, к сожалению, с отсутствием единообразных стандартов проектирования баз данных, несмотря на то, что SQL существует уже несколько десятилетий. Подо...