Разное

Java иерархия коллекций: Справочник по Java Collections Framework / Хабр

Содержание

Справочник по Java Collections Framework / Хабр

Данная публикация не является полным разбором или анализом (не покрывает пакет java.util.concurrent). Это, скорее, справочник, который поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.

Что такое Java Collections Framework?

Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».

Базовые понятия

На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» (словари).



Collection — этот интерфейс находится в составе JDK c версии 1.2 и определяет основные методы работы с простыми наборами элементов, которые будут общими для всех его реализаций (например size(), isEmpty(), add(E e) и др.). Интерфейс был слегка доработан с приходом дженериков в Java 1.5. Также, в версии Java 8, было добавлено несколько новых методов для работы с лямбдами (такие как

stream(), parallelStream(), removeIf(Predicate<? super E> filter) и др.).

Важно также отметить, что эти методы были реализованы непосредственно в интерфейсе как default-методы.

Map. Данный интерфейс также находится в составе JDK c версии 1.2 и предоставляет разработчику базовые методы для работы с данными вида «ключ — значение».Также как и Collection, он был дополнен дженериками в версии Java 1.5 и в версии Java 8 появились дополнительные методы для работы с лямбдами, а также методы, которые зачастую реализовались в логике приложения (getOrDefault(Object key, V defaultValue), putIfAbsent(K key, V value)).

Интерфейс Map [doc]

Hashtable — реализация такой структуры данных, как хэш-таблица. Она не позволяет использовать null в качестве значения или ключа. Эта коллекция была реализована раньше, чем Java Collection Framework, но в последствии была включена в его состав. Как и другие коллекции из Java 1.0, Hashtable является синхронизированной (почти все методы помечены как synchronized). Из-за этой особенности у неё имеются существенные проблемы с производительностью и, начиная с Java 1.2, в большинстве случаев рекомендуется использовать другие реализации интерфейса Map ввиду отсутствия у них синхронизации.

HashMap — коллекция является альтернативой Hashtable. Двумя основными отличиями от Hashtable являются то, что HashMap не синхронизирована и HashMap позволяет использовать null как в качестве ключа, так и значения. Так же как и Hashtable, данная коллекция не является упорядоченной: порядок хранения элементов зависит от хэш-функции. Добавление элемента выполняется за константное время O(1), но время удаления, получения зависит от распределения хэш-функции. В идеале является константным, но может быть и линейным O(n). Более подробную информацию о HashMap можно почитать здесь (актуально для Java < 8).

LinkedHashMap — это упорядоченная реализация хэш-таблицы. Здесь, в отличии от HashMap, порядок итерирования равен порядку добавления элементов. Данная особенность достигается благодаря двунаправленным связям между элементами (аналогично LinkedList). Но это преимущество имеет также и недостаток — увеличение памяти, которое занимет коллекция. Более подробная информация изложена в этой статье.

TreeMap — реализация Map основанная на красно-чёрных деревьях. Как и LinkedHashMap является упорядоченной. По-умолчанию, коллекция сортируется по ключам с использованием принципа «natural ordering», но это поведение может быть настроено под конкретную задачу при помощи объекта Comparator, который указывается в качестве параметра при создании объекта TreeMap.

WeakHashMap — реализация хэш-таблицы, которая организована с использованием weak references. Другими словами, Garbage Collector автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элеметна нет жёстких ссылок.

Интерфейс List [doc]

Реализации этого интерфейса представляют собой упорядоченные коллекции. Кроме того, разработчику предоставляется возможность доступа к элементам коллекции по индексу и по значению (так как реализации позволяют хранить дубликаты, результатом поиска по значению будет первое найденное вхождение).

Vector — реализация динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Vector появился в JDK версии Java 1.0, но как и Hashtable, эту коллекцию не рекомендуется использовать, если не требуется достижения потокобезопасности. Потому как в Vector, в отличии от других реализаций List, все операции с данными являются синхронизированными. В качестве альтернативы часто применяется аналог — ArrayList.

Stack — данная коллекция является расширением коллекции Vector. Была добавлена в Java 1.0 как реализация стека LIFO (last-in-first-out). Является частично синхронизированной коллекцией (кроме метода добавления push()). После добавления в Java 1.6 интерфейса Deque, рекомендуется использовать именно реализации этого интерфейса, например ArrayDeque.

ArrayList — как и Vector является реализацией динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Как можно догадаться из названия, его реализация основана на обычном массиве. Данную реализацию следует применять, если в процессе работы с коллекцией предплагается частое обращение к элементам по индексу. Из-за особенностей реализации поиндексное обращение к элементам выполняется за константное время O(1). Но данную коллекцию рекомендуется избегать, если требуется частое удаление/добавление элементов в середину коллекции. Подробный анализ и описание можно почитать в этом хабратопике.

LinkedList — ещё одна реализация List. Позволяет хранить любые данные, включая null. Особенностью реализации данной коллекции является то, что в её основе лежит двунаправленный связный список (каждый элемент имеет ссылку на предыдущий и следующий). Благодаря этому, добавление и удаление из середины, доступ по индексу, значению происходит за линейное время O(n), а из начала и конца за константное O(1). Так же, ввиду реализации, данную коллекцию можно использовать как стек или очередь. Для этого в ней реализованы соответствующие методы. На Хабре также есть статья с подробным анализом и описанием этой коллекции.

Интерфейс Set [doc]

Представляет собой неупорядоченную коллекцию, которая не может содержать дублирующиеся данные. Является программной моделью математического понятия «множество».

HashSet — реализация интерфейса Set, базирующаяся на HashMap. Внутри использует объект HashMap для хранения данных. В качестве ключа используется добавляемый элемент, а в качестве значения — объект-пустышка (new Object()). Из-за особенностей реализации порядок элементов не гарантируется при добавлении.

LinkedHashSet — отличается от HashSet только тем, что в основе лежит LinkedHashMap вместо HashMap. Благодаря этому отличию порядок элементов при обходе коллекции является идентичным порядку добавления элементов.

TreeSet — аналогично другим классам-реализациям интерфейса Set содержит в себе объект NavigableMap, что и обуславливает его поведение. Предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».

Интерфейс Queue [doc]

Этот интерфейс описывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очереди FIFO (first-in-first-out). Помимо методов, определённых в интерфейсе Collection, определяет дополнительные методы для извлечения и добавления элементов в очередь. Большинство реализаций данного интерфейса находится в пакете java.util.concurrent и подробно рассматриваются в данном обзоре.

PriorityQueue — является единственной прямой реализацией интерфейса Queue (была добавлена, как и интерфейс Queue, в Java 1.5), не считая класса LinkedList, который так же реализует этот интерфейс, но был реализован намного раньше. Особенностью данной очереди является возможность управления порядком элементов. По-умолчанию, элементы сортируются с использованием «natural ordering», но это поведение может быть переопределено при помощи объекта Comparator, который задаётся при создании очереди. Данная коллекция не поддерживает null в качестве элементов.

ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first-out). Интерфейс Deque и реализация ArrayDeque были добавлены в Java 1.6. Эта коллекция представляет собой реализацию с использованием массивов, подобно ArrayList, но не позволяет обращаться к элементам по индексу и хранение null. Как заявлено в документации, коллекция работает быстрее чем Stack, если используется как LIFO коллекция, а также быстрее чем LinkedList, если используется как FIFO.

Заключение

Java Collections Framework содержит большое количество различных структур данных, доступных в JDK «из коробки», которые в большинстве случаев покрывают все потребности при реализации логики приложения. Сравнение временных характеристик основных коллекций, которые зачастую используются в разработке приложений приведено в таблице:

При необходимости, разработчик может создать собственную реализацию, расширив или переопределив существующую логику, либо создав свою собственную реализацию подходящего интерфейса с нуля. Также существует некоторое количество готовых решений, которые являются альтернативой или дополнением к Java Collections Framework. Наиболее популярными являются Google Guava и Commons Collections.

В дополнение, хотелось бы указать в качестве дополнительного материала, ссылку на обзор пакета java.util.concurrent. Который является отличным дополнением к изложенному материалу.

Java Collections Framework – Telegraph

Coding

Что такое Java Collections

Java Collections являются одним из столпов Java Core. Они используются почти в каждом приложении, поэтому мы просто обязаны уметь использовать Java Collections Framework эффективно.

Collections— это контейнеры, группы элементов, которые представляют собой единое целое.

Например: банка конфет, список имен и т.д. Коллекции используются почти в каждом языке программирования и Java не является исключением. Как только коллекции появились в Java, то насчитывали всего несколько классов: Vector, Stack, Hashtable, Array.  Но уже в Java 1.2 появился полноценный Java Collections Framework, с которым мы и будем сегодня знакомиться.

Коллекции в Java состоят нескольких частей
  • Интерфейсы: В коллекциях интерфейсы обеспечивают абстрактный тип данных для представления коллекции java.util.Collection — корневого интерфейса фреймворка. Он находится на вершине иерархии Коллекций. Он содержит наиболее важные методы:  size()iterator()add()remove()clear(). Каждая коллекция должна реализовывать эти методы. Также есть другие важные интерфейсы java.util.List, java.util.Set,java.util.Queue и java.util.Map. Map является единственным интерфейсом, который не наследует интерфейс Collection, но является неотъемлемой частью коллекций. Все интерфейсы фреймворка находятся в пакете java.util.
Список интерфейсов и классов в Java Collections
  • Реализация: Java предоставляет готовые классы с реализацией вышеупомянутых коллекций. Мы можем использовать их для создания новых типов коллекций в нашей программе. С помощью классов ArrayList, LinkedList, HashMap, TreeMap, HashSet, TreeSet можно решить огромное количество задач, но если нам нужна специальная реализация той или иной коллекции, мы можем наследовать её и работать со своей реализацией. В Java 1.5 придумали потокобезопасные коллекции, которые позволили изменять содержимое коллекции время итерации по элементам. Наиболее популярными являются: CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet. Эти классы находятся в пакете java.util.concurrent. Все классы коллекций находятся в пакетах java.util и java.util.concurrent.
  • Алгоритмы: алгоритмы — это полезны методы, которые решают тривиальные задачи, например: поиск, сортировка и перетасовка элементов коллекции.

Преимущества Java Collections Framework

В Java Collections Framework есть следующие преимущества:

  • Требует меньше усилий.  Фреймворк располагает множеством распространенных типов коллекций и полезных методов для манипуляции данными. Таким образом, мы можем сосредоточиться на бизнес-логике, а не разработке наших API.
  • Отличное качество — использование хорошо проверенных коллекций увеличивает качество нашей программы.
  • Повторное использование и совместимость

List

List интерфейс

Реализации этого интерфейса представляют собой упорядоченные коллекции. Кроме того, разработчику предоставляется возможность доступа к элементам коллекции по индексу и по значению (так как реализации позволяют хранить дубликаты, результатом поиска по значению будет первое найденное вхождение).

Vector — реализация динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Vector появился в JDK версии Java 1.0, но как и Hashtable, эту коллекцию не рекомендуется использовать, если не требуется достижения потокобезопасности. Потому как в Vector, в отличии от других реализаций List, все операции с данными являются синхронизированными. В качестве альтернативы часто применяется аналог — ArrayList.

Stack — данная коллекция является расширением коллекции Vector. Была добавлена в Java 1.0 как реализация стека LIFO (last-in-first-out). Является частично синхронизированной коллекцией (кроме метода добавления push()). После добавления в Java 1.6 интерфейса Deque, рекомендуется использовать именно реализации этого интерфейса, например ArrayDeque.

ArrayList — как и Vector является реализацией динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Как можно догадаться из названия, его реализация основана на обычном массиве. Данную реализацию следует применять, если в процессе работы с коллекцией предплагается частое обращение к элементам по индексу. Из-за особенностей реализации поиндексное обращение к элементам выполняется за константное время O(1). Но данную коллекцию рекомендуется избегать, если требуется частое удаление/добавление элементов в середину коллекции.

LinkedList — ещё одна реализация List. Позволяет хранить любые данные, включая null. Особенностью реализации данной коллекции является то, что в её основе лежит двунаправленный связный список (каждый элемент имеет ссылку на предыдущий и следующий). Благодаря этому, добавление и удаление из середины, доступ по индексу, значению происходит за линейное время O(n), а из начала и конца за константное O(1). Так же, ввиду реализации, данную коллекцию можно использовать как стек или очередь. Для этого в ней реализованы соответствующие методы.


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

ArrayList и Vector оба являются классами в иерархии Collection Framework. ArrayList и Vector, оба используются для создания динамического массива объектов, размер которого может увеличиваться по мере необходимости. Существует два основных отличия ArrayList и Vector в том, что Vector принадлежит классам Legacy, которые впоследствии были реинжинирированы для поддержки классов коллекции, тогда как ArrayList является стандартным классом коллекции. Другое важное отличие состоит в том, что ArrayList не синхронизирован с другой стороны; Вектор синхронизирован.

Ключевые различия между ArrayList и векторами

  1. Несколько потоков могут работать с ArrayList одновременно, поэтому он считается несинхронизированным . В отличие от ArrayList, только один поток может работать с вектором одновременно; следовательно это называется Синхронизировано .
  2. В ранней версии Java некоторые классы и интерфейсы обеспечивали методы для хранения объектов, которые они называли классами Legacy. Вектор является одним из классов Legacy в Java. Позднее эти устаревшие классы были реинжинирированы для поддержки класса Collection, тогда как класс ArrayList является стандартным классом Collection.
  3. Когда предел массива полностью используется и новый объект добавляется рядом с исчерпанным массивом, его размер увеличивается в обоих случаях, т.е. как в ArrayList, так и в Vector, но разница в том, что в ArrayList, если не указан размер увеличивается на 50% от текущего массива, тогда как в массиве Vector размер удваивается, если значение приращения не указано.
  4. Vector использует Enumeration, а также Iterator для обхода массива, тогда как ArrayList использует итератор только для обхода массива.
  5. Поскольку ArrayList не синхронизирован и многие потоки могут работать с ним одновременно, его производительность лучше, чем у Vector, с которым одновременно может работать только один поток.

В чем разница между ArrayList и LinkedList?

Как выглядит ArrayList и LinkedList в Java

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

Операция поиска

Операция поиска в ArrayList довольно быстро по сравнению с операцией поиска LinkedList. Метод ArrayList get (int index)дает производительность O(1), в то время как производительность LinkedList равна O(n). Это связано с тем, что ArrayList позволяет произвольный доступ к элементам в списке, поскольку он работает с основанной на индексе структурой данных, в то время как LinkedList не разрешает произвольный доступ, поскольку он не имеет индексов для непосредственного доступа к элементам, он должен пересекать список для извлечения или получить доступ к элементу из списка.

Манипуляции

Манипуляция с ArrayList медленная, поскольку она внутренне использует массив. Если нам нужно вставить или удалить элемент в ArrayList, он может принимать O(n), поскольку он внутренне использует массив, и нам может потребоваться сдвинуть элементы в случае вставки или удаления. С другой стороны, манипуляции с LinkedList быстрее, чем ArrayList, потому что он использует двусвязный список, поэтому в памяти не требуется сдвиг бит. Если нам нужно вставить или удалить элемент в LinkedList, он будет принимать O(1), поскольку он внутренне использует дважды.

ArrayList — это более простая структура данных, чем LinkedList. ArrayList имеет один массив указателей в смежных ячейках памяти. Его нужно только воссоздать, если массив расширен за пределы выделенного размера. Но LinkedList состоит из цепочки узлов; каждый узел разделяется выделенным и имеет передние и задние указатели на другие узлы. Итак, если вам не нужно вставлять середину, сращивать, удалять в середине и т. Д., ArrayList обычно будет быстрее. Он нуждается в меньшем распределении памяти, имеет гораздо лучшую локальность ссылки (что важно для кэширования процессора) и т. Д.

Поведение

Arraylist ведет себя как List, поскольку он реализует список. LinkedList ведет себя как List a, а также Queue, поскольку он реализует List и Queue.

Накладные расходы памяти

ArrayList поддерживает индексы и данные элементов, в то время как LinkedList поддерживает данные элемента и два указателя для соседних узлов, следовательно, потребление памяти в LinkedList сравнительно велико.


Set

Представляет собой неупорядоченную коллекцию, которая не может содержать дублирующиеся данные. Является программной моделью математического понятия «множество».

HashSet — реализация интерфейса Set, базирующаяся на HashMap. Внутри использует объект HashMap для хранения данных. В качестве ключа используется добавляемый элемент, а в качестве значения — объект-пустышка (new Object()). Из-за особенностей реализации порядок элементов не гарантируется при добавлении.

LinkedHashSet — отличается от HashSet только тем, что в основе лежит LinkedHashMap вместо HashMap. Благодаря этому отличию порядок элементов при обходе коллекции является идентичным порядку добавления элементов.

TreeSet — аналогично другим классам-реализациям интерфейса Set содержит в себе объект NavigableMap, что и обуславливает его поведение. Предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».

Этот интерфейс описывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очереди FIFO (first-in-first-out). Помимо методов, определённых в интерфейсе Collection, определяет дополнительные методы для извлечения и добавления элементов в очередь. Большинство реализаций данного интерфейса находится в пакете java. util.concurrent и подробно рассматриваются в данном обзоре.

PriorityQueue — является единственной прямой реализацией интерфейса Queue (была добавлена, как и интерфейс Queue, в Java 1.5), не считая класса LinkedList, который так же реализует этот интерфейс, но был реализован намного раньше. Особенностью данной очереди является возможность управления порядком элементов. По-умолчанию, элементы сортируются с использованием «natural ordering», но это поведение может быть переопределено при помощи объекта Comparator, который задаётся при создании очереди. Данная коллекция не поддерживает null в качестве элементов.

ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first-out). Интерфейс Deque и реализация ArrayDeque были добавлены в Java 1.6. Эта коллекция представляет собой реализацию с использованием массивов, подобно ArrayList, но не позволяет обращаться к элементам по индексу и хранение null. Как заявлено в документации, коллекция работает быстрее чем Stack, если используется как LIFO коллекция, а также быстрее чем LinkedList, если используется как FIFO.


Map

Hashtable — реализация такой структуры данных, как хэш-таблица. Она не позволяет использовать null в качестве значения или ключа. Эта коллекция была реализована раньше, чем Java Collection Framework, но в последствии была включена в его состав. Как и другие коллекции из Java 1.0, Hashtable является синхронизированной (почти все методы помечены как synchronized). Из-за этой особенности у неё имеются существенные проблемы с производительностью и, начиная с Java 1.2, в большинстве случаев рекомендуется использовать другие реализации интерфейса Map ввиду отсутствия у них синхронизации.

HashMap — коллекция является альтернативой Hashtable. Двумя основными отличиями от Hashtable являются то, что HashMap не синхронизирована и HashMap позволяет использовать null как в качестве ключа, так и значения. Так же как и Hashtable, данная коллекция не является упорядоченной: порядок хранения элементов зависит от хэш-функции. Добавление элемента выполняется за константное время O(1), но время удаления, получения зависит от распределения хэш-функции. В идеале является константным, но может быть и линейным O(n). Более подробную информацию о HashMap можно почитать здесь (актуально для Java < 8).

LinkedHashMap — это упорядоченная реализация хэш-таблицы. Здесь, в отличии от HashMap, порядок итерирования равен порядку добавления элементов. Данная особенность достигается благодаря двунаправленным связям между элементами (аналогично LinkedList). Но это преимущество имеет также и недостаток — увеличение памяти, которое занимет коллекция. Более подробная информация изложена в этой статье.

TreeMap — реализация Map основанная на красно-чёрных деревьях. Как и LinkedHashMap является упорядоченной. По-умолчанию, коллекция сортируется по ключам с использованием принципа «natural ordering», но это поведение может быть настроено под конкретную задачу при помощи объекта Comparator, который указывается в качестве параметра при создании объекта TreeMap.

WeakHashMap — реализация хэш-таблицы, которая организована с использованием weak references. Другими словами, Garbage Collector автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элеметна нет жёстких ссылок.

Заключение

Java Collections Framework содержит большое количество различных структур данных, доступных в JDK «из коробки», которые в большинстве случаев покрывают все потребности при реализации логики приложения. Сравнение временных характеристик основных коллекций, которые зачастую используются в разработке приложений приведено в таблице:

Иерархия коллекций Java | Узнайте, что такое иерархия коллекций Java?

Иерархия коллекций Java — это иерархия всей структуры коллекций, содержащаяся в ней с четырьмя основными интерфейсами: Коллекция, Набор, Карта и Список. Кроме того, есть еще два специализированных интерфейса, а именно SortedSet и SortedMap, которые используются для целей сортировки. Все интерфейсы и классы для структуры иерархии коллекций размещены в java. util.package.

Что такое иерархия коллекций Java?

Иерархия коллекции Java в Java представляет собой структуру, обеспечивающую структурный дизайн, который используется для хранения и управления группой объектов. Иерархия коллекций Java выполнена со всеми операциями, выполняемыми с данными, такими как вставка, удаление, поиск, сортировка и обработка. Коллекция Java отображает единую единицу объектов. Он доступен с рядом интерфейсов, таких как Set, Queue, Deque, List, а также доступен с такими классами, как ArrayList, LinkedList, LinkedHashSet, HashSet, 9.0003

PriorityQueue, Vector и TreeSet. Кроме того, есть еще два фиксированных интерфейса, а именно SortedSet и SortedMap для целей сортировки. Все интерфейсы и классы для структуры иерархии коллекций размещены в java.util.package.

Интерфейсные методы иерархии коллекций Java

В иерархии коллекций Java существует несколько методов интерфейса коллекций, которые используются для управления элементами в коллекции. Давайте посмотрим на следующие методы интерфейса Java Collection,

  • add(): Этот метод в основном используется для вставки или добавления элемента в коллекцию. В самом названии указано, что добавить, добавить элемент в коллекцию. При добавлении нового элемента в коллекцию он возвращает TRUE, в противном случае возвращается FALSE. Это позволяет избежать дублирования, поэтому, если конкретный добавленный элемент уже присутствует, коллекция не принимает его. Общий синтаксис, используемый для метода add(), следующий:

Синтаксис : добавить (элемент объекта): логический

  • addAll(): Этот addAll() используется для добавления всех элементов указанной коллекции в эту коллекцию. При добавлении нового элемента в коллекцию он возвращает TRUE, в противном случае возвращается FALSE. Общий синтаксис, используемый для метода addAll(), следующий:

Синтаксис : addAll(Collection c) : Boolean

  • Clear(): этот метод clear() используется для удаления или очистки элемента в коллекции. Ничего не возвращает. Общий синтаксис, используемый для метода Clear(), следующий:

Синтаксис : clear() : void

  • Содержит(): Этот метод используется для проверки наличия определенного элемента в коллекции или нет, в основном он используется для поиска/нахождения элемента . Он возвращает TRUE, если он содержит определенный элемент в коллекции, в противном случае он возвращает FALSE. Общий синтаксис, используемый для метода contains(), следующий:

Синтаксис : содержит (элемент объекта) : логическое значение

  • ContainsAll(): Этот метод используется для проверки того, присутствует ли весь элемент в данной коллекции или нет. Он возвращает TRUE, если содержит все элементы коллекции, в противном случае возвращает FALSE. Общий синтаксис, используемый для метода containsAll(), следующий:

Синтаксис : containsAll(Collection c) : Boolean

  • equals(): Этот метод используется для проверки равенства с другим объектом, он сравнивает конкретный объект в коллекции на равенство.
    Общий синтаксис, используемый для метода equal(), следующий:

Синтаксис : equal(Object element) : Boolean

  • isEmpty(): Этот метод используется для возврата true только тогда, когда коллекция пуста, в противном случае он возвращает false. Общий синтаксис, используемый для метода isEmpty(), следующий:

Синтаксис : isEmpty() : Boolean

  • iterator(): Этот метод используется для возврата итератора по элементам коллекции. Общий синтаксис, используемый для метода iterator(), следующий:

Синтаксис : iterator() : iterator

  • remove(): Этот метод используется для возврата логического значения, если он удаляет элемент, он возвращает true, в противном случае он возвращает false. Он удаляет данный конкретный элемент из коллекции. Если есть повторяющееся значение, то удаляется первое вхождение объекта.
    Общий синтаксис, используемый для метода remove(), следующий:

Синтаксис : удалить (элемент объекта): логическое значение

  • removeAll(): Этот метод используется для возврата логического значения, если он удаляет все элементы, он возвращает true, в противном случае он возвращает false. Он удаляет весь элемент из коллекции. Общий синтаксис, используемый для метода removeAll(), следующий:

Синтаксис : removeAll (Collection c): Boolean

  • continueAll(): Этот метод используется для сохранения элементов, которые находятся только в коллекции, содержащейся в конкретной коллекции. Он возвращает логическое значение. Общий синтаксис, используемый для метода continueAll(), следующий:

Синтаксис : keepAll(Collection c): Boolean

  • size(): Этот метод используется для возврата количества элементов, присутствующих в коллекции. Тип возвращаемого значения метода Size() — целочисленный, он возвращает общее количество элементов в коллекции. Общий синтаксис, используемый для метода size(), следующий:

Синтаксис : size(): int

  • toArray(): Этот метод используется для возврата массива, содержащего элементы в коллекции. Он возвращается в виде элементов массива в коллекции. Общий синтаксис, используемый для метода toArray(), следующий:

Синтаксис : toArray(): Object [ ]

  • Object[ ] toArray():
    Этот метод используется для возврата массива, содержащегося в элементах, хранящихся в вызванной коллекции. Общий синтаксис, используемый для метода Object toArray(), следующий:

Синтаксис : toArray (массив объектов [ ]): Object [ ]

Методы иерархии коллекций Java

Классы иерархии коллекций Java реализуют основные интерфейсы, а также предоставляют надежные функциональные возможности. Давайте посмотрим на следующие методы,

  • Коллекция — Интерфейс коллекции представляет собой базовую корневую иерархию. Он предоставляет все методы, которые поддерживают все классы коллекций.
  • Список – Список представляет собой набор элементов в упорядоченном виде. Используя список, мы можем получить доступ к элементам по их индексу, а также найти элемент.
  • Набор –
    Набор представляет собой набор элементов в отсортированном виде.
  • Карта — Интерфейс карты доступен с тремя коллекциями, которые мы можем рассматривать как набор ключей, набор значений и набор способов сопоставления ключ-значение. Это позволяет хранить данные в парах ключ-значение.
  • Stack — представляет элементы в структурах данных стека, которые мы можем передать в метод LIFO (Last-In-First-Out) объектов.
  • Очередь — это структура данных очереди, которая предназначена для хранения элемента до обработки пользовательским потоком. Очередь обеспечивает операции вставки, проверки и извлечения.
  • Deque – это двусторонняя очередь, которая обеспечивает вставку и удаление элемента с обоих концов. Этот интерфейс предпочтительно использует класс стека.

Диаграммы классов иерархии коллекций Java

Давайте посмотрим на диаграмму классов иерархии коллекций Java, которая содержится в ней с четырьмя основными интерфейсами: коллекция, набор, карта и список. Кроме того, есть еще два специализированных интерфейса, а именно SortedSet и SortedMap, которые используются для целей сортировки. Все интерфейсы и классы для структуры иерархии коллекций размещены в java.util.package.

<изображение>

Синее поле представляет интерфейс

Красная рамка представляет класс

E➝ изображает расширения, которые являются ключевым словом, используемым для построения интерфейса между двумя классами и двумя интерфейсами.

I➝ изображает реализацию, которая является ключевым словом, используемым для построения наследования между классом и интерфейсом.

Заключение

Надеюсь, что статья поможет понять иерархию коллекций Java, она дает пользователю доступ к структурам данных, а также к алгоритмам для их работы. Это коллекция объектов, которая содержит ссылки на другие объекты. Интерфейс и классы упакованы в java.util.

Рекомендуемые статьи

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

  1. AVL tree java
  2. XML-парсер Java
  3. Двоичное дерево поиска в Java
  4. Структуры данных в Java

Иерархия коллекций в Java | Интерфейс коллекции

В этом уроке мы узнаем еще одну важную тему 9Иерархия коллекций 0018 в Java и интерфейс коллекций.

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

Если вы еще не знакомы со всеми этими понятиями, рекомендую один раз заглянуть.

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

Иерархия коллекций в Java


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

Иерархия всей структуры коллекции состоит из четырех основных интерфейсов, таких как Collection, List, Set, Map, и двух специализированных интерфейсов SortedSet и SortedMap для сортировки.

Все интерфейсы и классы для каркаса коллекции находятся в пакете java.util. Схема иерархии коллекций Java показана на рисунке ниже.

e➝ расширяет, I➝ реализует

Расширяет: Расширяет — это ключевое слово, которое используется для разработки наследования между двумя классами и двумя интерфейсами.

Реализует: Реализует — это ключевое слово, используемое для разработки наследования между классом и интерфейсом.

Интерфейс коллекции

в Java

1. Базовым интерфейсом структуры коллекций является интерфейс коллекций, который является корневым интерфейсом всех коллекций в API (интерфейс прикладного программирования).

Он находится на вершине иерархии коллекций в java. Он предоставляет основные операции для добавления и удаления элементов в коллекции.

2. Интерфейс коллекции расширяет интерфейс Iterable. Итерируемый интерфейс имеет только один метод, который называется iterator(). Функция метода итератора состоит в том, чтобы вернуть объект итератора. Используя этот объект итератора, мы можем перебирать элементы коллекции.

3. Список, Очередь и Набор имеют три компонента, которые расширяют интерфейс Коллекции. Карта не наследуется интерфейсом коллекции.


Интерфейс списка

1. Этот интерфейс представляет набор элементов, элементы которых расположены в последовательном порядке.

2. Список поддерживает порядок элементов, т. е. сохраняется порядок, в котором мы добавляем элементы, и та же самая последовательность, которую мы получим при извлечении элементов.

3. Мы можем вставлять элементы в список в любом месте. Список позволяет хранить повторяющиеся элементы в Java.

4. ArrayList, vector и LinkedList — это три конкретных подкласса, которые реализуют интерфейс списка.


Интерфейс набора

1. Этот интерфейс представляет набор элементов, который содержит уникальные элементы. т. е. используется для хранения коллекции уникальных элементов.

2. Интерфейс набора не поддерживает какой-либо порядок при сохранении элементов, и при извлечении мы можем не получить тот же порядок, в котором мы помещаем элементы. Все элементы в наборе могут быть в любом порядке.

3. Набор не допускает дублирования элементов.

4. Классы HashSet, LinkedHashSet, TreeSet реализуют интерфейс набора, а интерфейс сортировки расширяет интерфейс набора.

5. Его можно повторить с помощью Iterator, но нельзя повторить с помощью ListIterator.


Интерфейс SortedSet

1. Этот интерфейс расширяет набор, итератор которого пересекает его элементы в соответствии с их естественным порядком.

2. TreeSet реализует отсортированный интерфейс.


Интерфейс очереди

1. Очередь представляет собой упорядоченную группу однородных элементов, в которую новые элементы добавляются с одного конца (сзади), а элементы удаляются с другого конца (спереди). Так же, как очередь в супермаркете или любом магазине.

2. Этот интерфейс представляет собой особый тип списка, элементы которого удаляются только из головы.

3. LinkedList, Priority queue, ArrayQueue, Priority Blocking Queue и Linked Blocking Queue — это конкретные подклассы, реализующие интерфейс очереди.


Интерфейс Deque

1. Deque (двусторонняя очередь) — это подинтерфейс интерфейса очереди. Обычно произносится как «колода».

2. Этот интерфейс был добавлен в структуру сбора в Java SE 6.

3. Интерфейс Deque расширяет интерфейс очереди и использует его метод для реализации deque. Иерархия интерфейса deque показана на рисунке ниже.

4. Это линейный набор элементов, в который можно вставлять и удалять элементы с любого конца. т. е. он поддерживает вставку и удаление на обоих концах объекта класса, который его реализует.

5. Классы LinkedList и ArrayDeque реализуют интерфейс Deque.


Интерфейс карты

1. Интерфейс карты не наследуется интерфейсом коллекции. Он представляет собой объект, который хранит и извлекает элементы в виде пар ключ/значение, а их расположение на карте определяется ключом.

Иерархия интерфейса карты показана на рисунке ниже.

2. Карта использует метод хеширования для хранения пар ключ-значение. Он не позволяет хранить повторяющиеся ключи, но разрешены повторяющиеся значения.

3. Классы HashMap, HashTable, LinkedHashMap, TreeMap реализуют интерфейс Map.


Интерфейс SortedMap

Этот интерфейс представляет Карту, элементы которой хранятся в их естественном порядке. Он расширяет интерфейс Map, который, в свою очередь, реализуется классами TreeMap.

Методы интерфейса коллекции в Java


Интерфейс коллекции состоит всего из пятнадцати методов для управления элементами коллекции. Они следующие:

1. add(): Этот метод используется для добавления или вставки элемента в коллекцию. Общий синтаксис метода add() следующий:

 add(Object element) : boolean 

Если элемент добавлен в коллекцию, он вернет true, в противном случае false, если элемент уже присутствует, а коллекция отсутствует. т разрешить дубликаты.

2. addAll(): Этот метод добавляет коллекцию элементов в коллекцию. Он возвращает true, если элементы добавлены, в противном случае возвращает false. Общий синтаксис этого метода следующий:

 addAll(Collection c) : boolean 

3. clear(): Этот метод очищает или удаляет все элементы из коллекции. Общая форма этого метода следующая:

 clear() : void 

Этот метод ничего не возвращает.

4. contains(): Проверяет, присутствует элемент в коллекции или нет. То есть он используется для поиска элемента. Общий метод для contains() выглядит следующим образом:

 contains(Object element): boolean 

Этот метод возвращает true, если элемент присутствует, в противном случае false.

5. containsAll(): Этот метод проверяет, присутствует указанный набор элементов или нет. Он возвращает true, если вызывающая коллекция содержит все указанные элементы, в противном случае возвращает false. Общий синтаксис следующий:

 containsAll(Collection c) : boolean 

6. equals(): Проверяет равенство с другим объектом. Общая форма выглядит следующим образом:

 equals(Object element): boolean 

7. hashCode(): Возвращает номер хеш-кода для коллекции. Тип возвращаемого значения — целое число. Общая форма для этого метода:

 hashCode() : int 

8. isEmpty(): Возвращает true, если коллекция пуста. То есть этот метод возвращает true, если коллекция не содержит элементов.

 isEmpty() : boolean 

9. iterator(): Возвращает итератор. Общий вид приведен ниже:

 iterator() : Iterator 

10. remove(): Удаляет указанный элемент из коллекции. Общий синтаксис приведен ниже:

 remove(элемент объекта) : boolean 

Этот метод возвращает значение true, если элемент был удален. В противном случае возвращается ложь.

11. removeAll(): Метод removeAll() удаляет все элементы из коллекции. Возвращает true, если все элементы удалены, в противном случае возвращает false.

 removeAll (коллекция c): логическое значение 

12. continueAll(): Этот метод используется для удаления всех элементов из коллекции, кроме указанной коллекции. Возвращает true, если все элементы удалены, в противном случае возвращает false.

 continueAll(Collection c) : boolean 

13. size(): Метод size() возвращает общее количество элементов в коллекции. Тип возвращаемого значения — целое число. Общий синтаксис приведен ниже:

 size() : int 

14. toArray(): Он возвращает элементы коллекции в виде массива. Элементы массива являются копиями элементов коллекции.

 toArray() : Object[] 

15. Object[ ] toArray(): Возвращает массив, содержащий все элементы, хранящиеся в вызывающей коллекции. Элементы массива являются копиями элементов коллекции.

 toArray(массив объектов[]): Object[] 

Класс коллекций в Java


Классы коллекций реализуют интерфейсы коллекций. Они определены в пакете java.util. Некоторые классы предоставляют полные реализации, которые можно использовать как есть.

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

1. AbstractCollection: Реализует большую часть интерфейса коллекции. Это суперкласс для всех конкретных классов коллекций.

2. AbstractList: Он расширяет AbstractCollection и реализует большую часть интерфейса List.

3. AbstractQueue: Он расширяет AbstractCollection и реализует интерфейс очереди.

4. AbstractSequentialList: Он расширяет AbstractList и использует последовательный порядок доступа к элементам.

5. AbstractSet: Расширяет AbstractCollection и реализует большую часть интерфейса набора.


6. ArrayList: Реализует динамический массив путем расширения AbstractList.

7. EnumSet: Расширяет AbstractSet для использования с элементами перечисления.

8. HashSet: Расширяет AbstractSet для использования с хеш-таблицей.


9. LinkedHashSet: Расширяет HashSet, чтобы разрешить итерации порядка вставки.

10. LinkedList: Реализует связанный список, расширяя AbstractSequentialList.

11. PriorityQueue: Расширяет AbstractQueue для поддержки очереди на основе приоритетов.

12. TreeSet: Расширяет AbstractSet и реализует интерфейс SortedSet.


Ключевые точки иерархии коллекций

Некоторые ключевые точки иерархии коллекций, о которых следует помнить, следующие:

  • Ключевые интерфейсы в иерархии коллекций — список, набор, очередь и карта.
  • Ключевыми классами реализации в иерархии коллекций являются ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue, HashMap и TreeMap.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *