March 12, 2023

кр инфа

Generic

Дженерики (обобщения) — это особые средства языка Java для реализации обобщённого программирования: особого подхода к описанию данных и алгоритмов, позволяющего работать с различными типами данных без изменения их описания

После компиляции какая-либо информация о дженериках стирается.

правило #1: всегда использовать diamond синтаксис, если мы используем типизированные типы. В противном случае мы рискуем пропустить, где у нас используется raw type.

дженерик методы

дженерик классы

ограничение дженериков

extends ограничивает сверху, типо от number наследуются integer и тд, значит их можно будет запихать после ?, а вот уже object нельзя будет

просто ? по приколу сделан

super типо снизу ограничивает

Наследование дженериков

List<String> list1 = new ArrayList<>();

List<Object> list2 = list1;

это не сработает

дженерики с массивами

T[] buf = (T[]) new Object[len]

Iterator\Iterable

Итератор – это специальный внутренний объект в коллекции, который с одной стороны имеет доступ ко всем ее private данным и знает ее внутреннюю структуру, с другой – реализует общедоступный интерфейс Iterator, благодаря чему все знают, как с ним работать

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

Думаю, ты уже сталкивался с тем, что при работе с for each нельзя одновременно «идти по коллекции циклом» и удалять из нее элементы. Это все именно из-за устройства итератора.

iterable

Comparator\Comparable

  1. Comparator и Comparable - это оба интерфейсы
  2. Коллекция (ну хорошо, объект) является Comparable, когда объект может быть как то сравнен с другим объектом.
  3. Comparator, в отличие от этого — это способ сравнения объектов.

Пример: школьники на уроке физкультуры, физрук говорит: строиться по росту! - ученики быстренько сравнивают свои росты и строятся - кто выше вперед, кто ниже в хвост строя - это пример реализации Comparable, где в качестве compareTo(сосед) используется рост учеников.

Второй пример: те же школьники. Директор дает задание учителю математики сравнить учеников по успеваемости. Математичка берет журнал и сравнивает учеников по успеваемости - здесь работает compare(ученик1, ученик2) - Comparator'ом выступает математичка. Аналогично компаратором может выступить русичка или трудовик.

Collections

отдельный класс который умеет сортировать массивы, умеет их переворачивать, рандомить и всякий такой хлам

Collection

  • Collection: базовый интерфейс для всех коллекций и других интерфейсов коллекций
  • Queue: наследует интерфейс Collection и представляет функционал для структур данных в виде очереди
  • Deque: наследует интерфейс Queue и представляет функционал для двунаправленных очередей
  • List: наследует интерфейс Collection и представляет функциональность простых списков
  • Set: также расширяет интерфейс Collection и используется для хранения множеств уникальных объектов
  • SortedSet: расширяет интерфейс Set для создания сортированных коллекций
  • NavigableSet: расширяет интерфейс SortedSet для создания коллекций, в которых можно осуществлять поиск по соответствию
  • Map: предназначен для созданий структур данных в виде словаря, где каждый элемент имеет определенный ключ и значение. В отличие от других интерфейсов коллекций не наследуется от интерфейса Collection

Эти интерфейсы частично реализуются абстрактными классами:

  • AbstractCollection: базовый абстрактный класс для других коллекций, который применяет интерфейс Collection
  • AbstractList: расширяет класс AbstractCollection и применяет интерфейс List, предназначен для создания коллекций в виде списков
  • AbstractSet: расширяет класс AbstractCollection и применяет интерфейс Set для создания коллекций в виде множеств
  • AbstractQueue: расширяет класс AbstractCollection и применяет интерфейс Queue, предназначен для создания коллекций в виде очередей и стеков
  • AbstractSequentialList: также расширяет класс AbstractList и реализует интерфейс List. Используется для создания связанных списков
  • AbstractMap: применяет интерфейс Map, предназначен для создания наборов по типу словаря с объектами в виде пары "ключ-значение"

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

  • ArrayList: простой список объектов
  • LinkedList: представляет связанный список
  • ArrayDeque: класс двунаправленной очереди, в которой мы можем произвести вставку и удаление как в начале коллекции, так и в ее конце
  • HashSet: набор объектов или хеш-множество, где каждый элемент имеет ключ - уникальный хеш-код
  • TreeSet: набор отсортированных объектов в виде дерева
  • LinkedHashSet: связанное хеш-множество
  • PriorityQueue: очередь приоритетов
  • HashMap: структура данных в виде словаря, в котором каждый объект имеет уникальный ключ и некоторое значение
  • TreeMap: структура данных в виде дерева, где каждый элемент имеет уникальный ключ и некоторое значение

Среди методов интерфейса Collection можно выделить следующие:

  • boolean add (E item): добавляет в коллекцию объект item. При удачном добавлении возвращает true, при неудачном - false
  • boolean addAll (Collection<? extends E> col): добавляет в коллекцию все элементы из коллекции col. При удачном добавлении возвращает true, при неудачном - false
  • void clear (): удаляет все элементы из коллекции
  • boolean contains (Object item): возвращает true, если объект item содержится в коллекции, иначе возвращает false
  • boolean isEmpty (): возвращает true, если коллекция пуста, иначе возвращает false
  • Iterator<E> iterator (): возвращает объект Iterator для обхода элементов коллекции
  • boolean remove (Object item): возвращает true, если объект item удачно удален из коллекции, иначе возвращается false
  • boolean removeAll (Collection<?> col): удаляет все объекты коллекции col из текущей коллекции. Если текущая коллекция изменилась, возвращает true, иначе возвращается false
  • boolean retainAll (Collection<?> col): удаляет все объекты из текущей коллекции, кроме тех, которые содержатся в коллекции col. Если текущая коллекция после удаления изменилась, возвращает true, иначе возвращается false
  • int size (): возвращает число элементов в коллекции
  • Object[] toArray (): возвращает массив, содержащий все элементы коллекции

Map

Интерфейс Map<K, V> представляет отображение или иначе говоря словарь, где каждый элемент представляет пару "ключ-значение". При этом все ключи уникальные в рамках объекта Map. Такие коллекции облегчают поиск элемента, если нам известен ключ - уникальный идентификатор объекта.

Следует отметить, что в отличие от других интерфейсов, которые представляют коллекции, интерфейс Map НЕ расширяет интерфейс Collection.

Среди методов интерфейса Map можно выделить следующие:

  • void clear(): очищает коллекцию
  • boolean containsKey(Object k): возвращает true, если коллекция содержит ключ k
  • boolean containsValue(Object v): возвращает true, если коллекция содержит значение v
  • Set<Map.Entry<K, V>> entrySet(): возвращает набор элементов коллекции. Все элементы представляют объект Map.Entry
  • boolean equals(Object obj): возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj
  • boolean isEmpty: возвращает true, если коллекция пуста
  • V get(Object k): возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение null
  • V getOrDefault(Object k, V defaultValue): возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение defaultVlue
  • V put(K k, V v): помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом, то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции, то возвращается значение null
  • V putIfAbsent(K k, V v): помещает в коллекцию новый объект с ключом k и значением v, если в коллекции еще нет элемента с подобным ключом.
  • Set<K> keySet(): возвращает набор всех ключей отображения
  • Collection<V> values(): возвращает набор всех значений отображения
  • void putAll(Map<? extends K, ? extends V> map): добавляет в коллекцию все объекты из отображения map
  • V remove(Object k): удаляет объект с ключом k
  • int size(): возвращает количество элементов коллекции

Чтобы положить объект в коллекцию, используется метод put, а чтобы получить по ключу - метод get. Реализация интерфейса Map также позволяет получить наборы как ключей, так и значений. А метод entrySet() возвращает набор всех элементов в виде объектов Map.Entry<K, V>.

Обобщенный интерфейс Map.Entry<K, V> представляет объект с ключом типа K и значением типа V и определяет следующие методы:

  • boolean equals(Object obj): возвращает true, если объект obj, представляющий интерфейс Map.Entry, идентичен текущему
  • K getKey(): возвращает ключ объекта отображения
  • V getValue(): возвращает значение объекта отображения
  • V setValue(V v): устанавливает для текущего объекта значение v
  • int hashCode(): возвращает хеш-код данного объекта

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

У интерфейса Map существует 3 метода, которые возвращают перечень элементов:

  • keySet() — возвращает множество(Set) ключей;
  • values() — возвращает коллекцию(Collection) значений;
  • entrySet() — возвращает множество(Set) наборов “ключ-значение”.

LinkedList

Обобщенный класс LinkedList<E> представляет структуру данных в виде связанного списка. Он наследуется от класса AbstractSequentialList и реализует интерфейсы List, Dequeue и Queue. То есть он соединяет функциональность работы со списком и фукциональность очереди.

Класс LinkedList имеет следующие конструкторы:

  • LinkedList(): создает пустой список
  • LinkedList(Collection<? extends E> col): создает список, в который добавляет все элементы коллекции col

LinkedList содержит все те методы, которые определены в интерфейсах List, Queue, Deque. Некоторые из них:

  • addFirst() / offerFirst(): добавляет элемент в начало списка
  • addLast() / offerLast(): добавляет элемент в конец списка
  • removeFirst() / pollFirst(): удаляет первый элемент из начала списка
  • removeLast() / pollLast(): удаляет последний элемент из конца списка
  • getFirst() / peekFirst(): получает первый элемент
  • getLast() / peekLast(): получает последний элемент

Лямбда-выражения

Stream API

https://metanit.com/java/tutorial/10.6.php

https://habr.com/ru/company/otus/blog/658999/

Работа с files

https://metanit.com/java/tutorial/6.11.php

https://vertex-academy.com/tutorials/ru/filewriter-i-filereader/

Тестирование

https://javarush.com/groups/posts/605-junit