Рубрики
Без рубрики

Коллекции на Java – Все, что Вы ДОЛЖНЫ знать

API коллекций Java является наиболее важной частью основной Java. Мы используем Список, карту и Набор для хранения объектов. Краткое введение в коллекции на Java.

Автор оригинала: Pankaj Kumar.

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

Что такое платформа коллекций Java?

Коллекции подобны контейнерам, которые группируют несколько элементов в одно целое. Например, банка шоколадных конфет, список имен и т. Д.

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

Java 1.2 предоставляет Collections Framework , то есть архитектуру для представления и управления коллекциями в java стандартным способом. Структура коллекций Java состоит из следующих частей:

1. Интерфейсы

Интерфейсы платформы Java Collections предоставляют абстрактный тип данных для представления коллекции.

java.util.Коллекция – это корневой интерфейс платформы коллекций. Он находится на вершине иерархии структуры коллекций. Он содержит некоторые важные методы, такие как size (), iterator (), add (), remove (), clear (), которые должен реализовать каждый класс коллекции.

Некоторые другие важные интерфейсы-java.util.Список, java.util.Набор, java.util.Очередь и java.util.Карта. Карта-это единственный интерфейс, который не наследуется от интерфейса коллекции, но является частью структуры коллекций. Все интерфейсы платформы коллекций присутствуют в пакете java.util.

2. Классы Реализации

Платформа коллекций Java предоставляет классы реализации для интерфейсов основных коллекций. Мы можем использовать их для создания различных типов коллекций в программе Java.

Некоторыми важными классами коллекций являются ArrayList, LinkedList, HashMap, TreeMap, HashSet и набор деревьев. Эти классы решают большинство наших потребностей в программировании, но если нам нужен какой-то специальный класс коллекции, мы можем расширить их, чтобы создать наш собственный класс коллекции.

Java 1.5 разработала потокобезопасные классы коллекций, которые позволяли нам изменять коллекции во время их перебора. Некоторые из них-CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet. Эти классы находятся в пакете java.util.concurrent.

Все классы коллекции присутствуют в пакете java.util и java.util.concurrent.

3. Алгоритмы

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

Схема классов структуры коллекций

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

Преимущества платформы коллекций Java

Платформа коллекций Java имеет следующие преимущества:

  • Сокращение усилий по разработке – Он поставляется почти со всеми распространенными типами коллекций и полезными методами для итерации и обработки данных. Таким образом, мы можем больше сосредоточиться на бизнес-логике, а не на разработке API-интерфейсов для сбора данных.
  • Лучшее качество – Использование хорошо протестированных классов базовой коллекции повышает качество нашей программы, а не использование какой-либо домашней структуры данных.
  • Возможность повторного использования и совместимость
  • Уменьшите усилия по обслуживанию, потому что все знают классы API коллекции.

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

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

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

1. Интерфейс сбора данных

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

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

Интерфейс коллекции также предоставляет методы массовых операций, которые работают со всей коллекцией – containsAll, addAll, removeAll, retainAll, clear.

Методы toArray предоставляются в качестве моста между коллекциями и более старыми API, которые ожидают массивы при вводе.

2. Интерфейс Итератора

Интерфейс итератора предоставляет методы для перебора элементов коллекции. Мы можем получить экземпляр итератора с помощью метода iterator () . Итератор заменяет Перечисление в структуре коллекций Java. Итераторы позволяют вызывающему объекту удалять элементы из базовой коллекции во время итерации. Итераторы в классах коллекций реализуют Шаблон проектирования итератора .

3. Установите интерфейс

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

Платформа Java содержит три реализации наборов общего назначения: HashSet , TreeSet и LinkedHashSet . Интерфейс набора не допускает произвольного доступа к элементу коллекции. Вы можете использовать итератор или цикл foreach для обхода элементов набора.

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

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

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

List strList = new ArrayList<>();

//add at last
strList.add(0, "0");

//add at specified index
strList.add(1, "1");

//replace
strList.set(1, "2");

//remove
strList.remove("1");

Класс коллекций предоставляет некоторый полезный алгоритм для сортировки списков, перемешивания, обратного, двоичного поиска и т. Д.

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

Очередь-это коллекция, используемая для хранения нескольких элементов перед обработкой. Помимо основных операций сбора, Очередь обеспечивает дополнительные операции вставки, извлечения и проверки.

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

6. Интерфейс удаления из Очереди

Линейная коллекция, поддерживающая вставку и удаление элементов с обоих концов. Название deque является сокращением от “двусторонняя очередь” и обычно произносится как “колода”. Большинство реализаций Deque не устанавливают фиксированных ограничений на количество элементов, которые они могут содержать, но этот интерфейс поддерживает deques с ограниченной емкостью, а также те, у которых нет фиксированного ограничения по размеру.

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

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

Карта Java-это объект, который сопоставляет ключи со значениями. Карта не может содержать дубликатов ключей: каждый ключ может сопоставляться не более чем с одним значением.

Платформа Java содержит три реализации карт общего назначения: HashMap, TreeMap и LinkedHashMap.

Основными операциями Map являются put, get, containsKey, containsValue, size и isEmpty.

8. Интерфейс листератора

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

В Java ListIterator нет текущего элемента; его положение курсора всегда находится между элементом, который был бы возвращен вызовом функции previous (), и элементом, который был бы возвращен вызовом функции next().

9. Интерфейс SortedSet

SortedSet-это набор, который сохраняет свои элементы в порядке возрастания. Для использования преимуществ заказа предусмотрено несколько дополнительных операций. Отсортированные наборы используются для естественно упорядоченных наборов, таких как списки слов и списки участников.

10. Интерфейс SortedMap

Карта, которая сохраняет свои сопоставления в порядке возрастания ключа. Это аналог карты SortedSet. Отсортированные карты используются для естественно упорядоченных коллекций пар ключ/значение, таких как словари и телефонные справочники.

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

Платформа Java Collections поставляется со многими классами реализации для интерфейсов. Наиболее распространенными реализациями являются ArrayList , HashMap и HashSet. Java 1.5 включала параллельные реализации; например, ConcurrentHashMap и CopyOnWriteArrayList. Обычно классы коллекций не являются потокобезопасными, а их итератор работает быстро. В этом разделе мы узнаем о часто используемых классах коллекций.

1. Класс хэш-набора

Java HashSet является базовой реализацией интерфейса набора, поддерживаемого HashMap . Это не гарантирует порядок итераций набора и разрешает null элемент.

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

2. Класс набора деревьев

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

См.: Сопоставимый компаратор Java

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

Обратите внимание, что порядок, поддерживаемый набором (независимо от того, предусмотрен ли явный компаратор или нет), должен соответствовать equals, чтобы правильно реализовать интерфейс набора. (См. Сопоставимый или Компаратор для точного определения соответствия равным.) Это происходит потому, что интерфейс набора определен в терминах операции “равно”, но экземпляр набора деревьев выполняет все сравнения элементов с помощью метода compareTo (или сравнения), поэтому два элемента, которые считаются равными с помощью этого метода, с точки зрения набора равны.

3. Класс ArrayList

Java ArrayList-это реализация интерфейса списка с возможностью изменения размера массива. Реализует все необязательные операции со списком и разрешает все элементы, включая null. В дополнение к реализации интерфейса списка этот класс предоставляет методы для управления размером массива, который используется внутри для хранения списка. (Этот класс примерно эквивалентен Vector, за исключением того, что он несинхронизирован.)

Операции size, isEmpty, get, set, итератор и листератор выполняются в постоянное время. Операция добавления выполняется в амортизированное постоянное время, то есть для добавления n элементов требуется O(n) времени. Все остальные операции выполняются в линейное время (грубо говоря). Коэффициент константы невелик по сравнению с коэффициентом для реализации Связанного списка.

Дальнейшее чтение: Java ArrayList и итератор

4. Класс LinkedList

Реализация двусвязного списка интерфейсов List и Deque. Реализует все необязательные операции со списком и разрешает все элементы (включая null).

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

5. Класс HashMap

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

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

Далее читайте: HashMap против ConcurrentHashMap

6. Класс древовидной карты

Реализация навигационной карты на основе красно-черного дерева. Карта сортируется в соответствии с естественным порядком ее ключей или с помощью компаратора, предоставляемого во время создания карты, в зависимости от используемого конструктора.

Эта реализация обеспечивает гарантированную стоимость времени регистрации(n) для операций containsKey, get, put и remove. Алгоритмы являются адаптацией тех, что описаны во введении Кормена, Лейзерсона и Ривеста к алгоритмам.

Обратите внимание, что порядок, поддерживаемый картой дерева, как и любой отсортированной картой, и независимо от того, предусмотрен ли явный компаратор, должен соответствовать equals, если эта отсортированная карта правильно реализует интерфейс карты. (См. Сопоставимый или Компаратор для точного определения соответствия равным.) Это происходит потому, что интерфейс карты определен в терминах операции “равно”, но отсортированная карта выполняет все сравнения ключей с помощью метода compareTo (или сравнения), поэтому два ключа, которые считаются равными этим методом, с точки зрения отсортированной карты равны. Поведение отсортированной карты четко определено, даже если ее порядок не соответствует равным; она просто не подчиняется общему контракту интерфейса карты.

7. Класс приоритетной очереди

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

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

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

Этот класс содержит методы для алгоритмов структуры сбора, такие как двоичный поиск , сортировка, перетасовка, реверс и т.д.

Синхронизированные Обертки

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

public static  Collection synchronizedCollection(Collection c);
public static  Set synchronizedSet(Set s);
public static  List synchronizedList(List list);
public static  Map synchronizedMap(Map m);
public static  SortedSet synchronizedSortedSet(SortedSet s);
public static  SortedMap synchronizedSortedMap(SortedMap m);

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

Неизменяемые обертки

Неизменяемые оболочки лишают возможности изменять коллекцию, перехватывая все операции, которые могли бы изменить коллекцию, и создавая исключение UnsupportedOperationException . Его основным использованием являются;

  • Чтобы сделать коллекцию неизменной после ее создания. В этом случае рекомендуется не сохранять ссылку на резервную коллекцию. Это абсолютно гарантирует неизменность.
  • Чтобы разрешить определенным клиентам доступ только для чтения к вашим структурам данных. Вы сохраняете ссылку на резервную коллекцию, но раздаете ссылку на оболочку. Таким образом, клиенты могут просматривать, но не изменять, в то время как вы сохраняете полный доступ.
public static  Collection unmodifiableCollection(Collection c);
public static  Set unmodifiableSet(Set s);
public static  List unmodifiableList(List list);
public static  Map unmodifiableMap(Map m);
public static  SortedSet unmodifiableSortedSet(SortedSet s);
public static  SortedMap unmodifiableSortedMap(SortedMap m);

Классы Потокобезопасных коллекций

Параллельный пакет Java 1.5 ( java.util.concurrent ) содержит потокобезопасные классы коллекций, которые позволяют изменять коллекции во время итерации. По замыслу итератор работает быстро и вызывает исключение ConcurrentModificationException. Некоторые из этих классов CopyOnWriteArrayList , ConcurrentHashMap , CopyOnWriteArraySet .

  • Избегайте исключения ConcurrentModificationException
  • Пример CopyOnWriteArrayList
  • HashMap против ConcurrentHashMap

Наборы алгоритмов API

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

1. Сортировка

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

2. Перетасовка

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

3. Поиск

Алгоритм двоичного поиска выполняет поиск указанного элемента в отсортированном списке. Этот алгоритм имеет две формы. Первый принимает список и элемент для поиска (“ключ поиска”).

Эта форма предполагает, что список отсортирован в порядке возрастания в соответствии с естественным порядком его элементов.

Вторая форма принимает Компаратор в дополнение к Списку и ключу поиска и предполагает, что список отсортирован в порядке возрастания в соответствии с указанным Компаратором.

Алгоритм сортировки можно использовать для сортировки списка перед вызовом BinarySearch.

4. Состав

Частотные и непересекающиеся алгоритмы проверяют некоторые аспекты состава одной или нескольких коллекций.

  • частота : подсчитывает, сколько раз указанный элемент встречается в указанной коллекции
  • непересекающиеся : определяет, являются ли две коллекции непересекающимися; то есть не содержат ли они общих элементов

5. Минимальные и максимальные значения

Алгоритмы min и max возвращают, соответственно, минимальный и максимальный элемент, содержащиеся в указанной коллекции. Обе эти операции бывают двух видов. Простая форма принимает только коллекцию и возвращает минимальный (или максимальный) элемент в соответствии с естественным порядком элементов.

Функции API коллекций Java 8

Самые большие изменения в Java 8 связаны с API-интерфейсами сбора данных. Некоторые из важных изменений и улучшений заключаются в:

  1. Введение потокового API для последовательной, а также параллельной обработки, вам следует прочитать Учебник по потоковому API Java для получения более подробной информации.
  2. Итерируемый интерфейс был расширен с помощью метода по умолчанию forEach() для итерации по коллекции.
  3. Лямбда-выражение и функциональные интерфейсы в основном полезны для классов API коллекции.

Изменения API коллекций Java 10

  1. Методы List.copy, Set.copy и Map.copyOf для создания неизменяемых коллекций.
  2. Класс Collectors получает различные методы для сбора неизменяемых коллекций (Набор, список, Карта). Эти имена методов относятся к немодифицируемому списку, к немодифицируемому набору и к немодифицируемой карте.

Давайте рассмотрим пример использования этих новых методов API коллекций Java 10.

package com.journaldev.collections;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class JDK10CollectionFunctions {

	public static void main(String[] args) {

		// 1. List, Set, Map copyOf(Collection) method
		List actors = new ArrayList<>();

		actors.add("Jack Nicholson");
		actors.add("Marlon Brando");

		System.out.println(actors);
		// prints [Jack Nicholson, Marlon Brando]

		// New API added - Creates an UnModifiable List from a List.
		List copyOfActors = List.copyOf(actors);

		System.out.println(copyOfActors);
		// prints [Jack Nicholson, Marlon Brando]

		// copyOfActors.add("Robert De Niro"); Will generate
		// UnsupportedOperationException

		actors.add("Robert De Niro");

		System.out.println(actors);
		// prints [Jack Nicholson, Marlon Brando, Robert De Niro]

		System.out.println(copyOfActors);
		// prints [Jack Nicholson, Marlon Brando]

		// 2. Collectors class toUnmodifiableList, toUnmodifiableSet, and
		// toUnmodifiableMap methods
		List collect = actors.stream().collect(Collectors.toUnmodifiableList());
		System.out.println(collect);
	}

}

Изменения API коллекций Java 11

Новый метод по умолчанию toArray(генератор функций []>) добавлен в интерфейс коллекции. Этот метод возвращает массив, содержащий все элементы в этой коллекции, используя предоставленную функцию генератора для выделения возвращаемого массива. []>)

package com.journaldev.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JDK11CollectionFunctions {

	public static void main(String[] args) {

		/*
		 * JDK 11 New Method in Collection interface 
		 * default  T[] toArray(IntFunction generator) {
		 * return toArray(generator.apply(0)); }
		 */

		List strList = new ArrayList<>();
		strList.add("Java");
		strList.add("Python");
		strList.add("Android");

		String[] strArray = strList.toArray(size -> new String[size]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size + 5]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size * 3]);
		System.out.println(Arrays.toString(strArray));
	}

}

Выход:

[Java, Python, Android]
[Java, Python, Android, null, null]
[Java, Python, Android]

Классы коллекций в двух словах

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

URL-адрес загрузки : Классы коллекции Java

Список объектов
Список ссылок
Набор хэшей
Набор деревьев
Хэш-карта
Карта деревьев
Вектор
Хэш-таблица
Свойства
Стек
Копирайтеррайлист
Карта совпадений
Копировальный набор

Я надеюсь, что в этом уроке объяснено большинство тем в рамках коллекций Java. Пожалуйста, поделитесь своим мнением с комментариями.

Ссылка: Документация Oracle