Java for Beginner
676 subscribers
544 photos
155 videos
12 files
835 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Потом 200-метровый забег за 🍻 и регулярные старты до холодильника😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Основные методы LinkedHashSet и их применение

add(E e):
Добавляет указанный элемент в множество, если он еще отсутствует.
Возвращает true, если элемент был добавлен, и false, если он уже присутствовал в множестве.
LinkedHashSet<String> set = new LinkedHashSet<>();
boolean added = set.add("Apple"); // Возвращает true
added = set.add("Apple"); // Возвращает false, так как элемент уже существует


remove(Object o):
Удаляет указанный элемент из множества, если он присутствует.
Возвращает true, если элемент был удален, и false, если его не было в множестве.

boolean removed = set.remove("Apple"); // Возвращает true, если "Apple" был удален
removed = set.remove("Banana"); // Возвращает false, если "Banana" не был в наборе


contains(Object o):
Проверяет, присутствует ли указанный элемент в множестве.
Возвращает true, если элемент присутствует, и false в противном случае.

boolean exists = set.contains("Apple"); // Возвращает true, если "Apple" присутствует


isEmpty():
Проверяет, пусто ли множество.
Возвращает true, если множество пусто, и false в противном случае.

boolean isEmpty = set.isEmpty(); // Проверка, пуст ли набор


size():
Возвращает количество элементов в множестве.
int size = set.size(); // Получение размера набора


clear():
Удаляет все элементы из множества. После вызова этого метода множество будет пустым.
set.clear(); // Очищает множество


iterator():
Возвращает итератор для обхода элементов в множестве. Порядок обхода будет соответствовать порядку вставки элементов.
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}


clone():
Создает поверхностную копию LinkedHashSet.
LinkedHashSet<String> clonedSet = (LinkedHashSet<String>) set.clone();



Примеры использования LinkedHashSet

Сохранение порядка уникальных элементов:

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

LinkedHashSet<String> orderedSet = new LinkedHashSet<>();
orderedSet.add("One");
orderedSet.add("Two");
orderedSet.add("Three");
orderedSet.add("Two"); // Дубликат будет проигнорирован

for (String item : orderedSet) {
System.out.println(item);
}
// Вывод будет в порядке вставки: One, Two, Three


Реализация простого кеша:

LinkedHashSet может использоваться для реализации кеша, где важно сохранить порядок недавнего использования элементов.
LinkedHashSet<String> cache = new LinkedHashSet<>();
cache.add("Page1");
cache.add("Page2");
cache.add("Page3");

if (cache.size() > 2) {
String first = cache.iterator().next();
cache.remove(first);
}

cache.add("Page4");

System.out.println(cache);
// Вывод: [Page2, Page3, Page4]


Создание списка с исключением дубликатов:

LinkedHashSet позволяет быстро создать список уникальных элементов, сохраняя их порядок.
List<String> listWithDuplicates = Arrays.asList("a", "b", "c", "a", "b");
LinkedHashSet<String> uniqueSet = new LinkedHashSet<>(listWithDuplicates);

System.out.println(uniqueSet); // Вывод: [a, b, c]


#Java #Training #Medium #LinkedHashSet
Уважаемые подписчики!

В это воскресение, 25.08.24 в 16:00 по МСК, мы вновь соберемся для онлайн встречи и будем рассматривать последние 4 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.


Хотелось бы услышать мнение лично от Вас!
Выберите время и приходите, будет интересно)))


Ну или как минимум, напишите в комментах, почему не можете)))
TreeSet, особенности и внутреннее устройство

TreeSet — это класс в Java, представляющий собой коллекцию, которая хранит элементы в отсортированном порядке. Он является частью Java Collection Framework и имплементирует интерфейсы NavigableSet, SortedSet, и косвенно Set. Это значит, что TreeSet не допускает дубликатов и автоматически сортирует элементы при их добавлении.

Особенности TreeSet:

Автоматическая сортировка: Элементы в TreeSet автоматически сортируются в соответствии с естественным порядком (Comparable) или по переданному компаратору (Comparator).
Уникальные элементы: Как и любой другой Set, TreeSet не допускает дублирования элементов.
Балансировка: TreeSet основан на сбалансированном бинарном дереве поиска, что гарантирует логарифмическое время выполнения основных операций (добавление, удаление, поиск).
Навигация по элементам: TreeSet предоставляет методы для быстрого доступа к наименьшему и наибольшему элементам, а также позволяет эффективно находить элементы, ближайшие к заданному значению.


Внутреннее устройство TreeSet

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

Основные характеристики TreeSet:

Естественный порядок: Если элементы реализуют интерфейс Comparable, они сортируются по нему. Например, строки сортируются в лексикографическом порядке, числа — по возрастанию.
Пользовательский компаратор: Если нужно задать специфический порядок сортировки, можно передать объект Comparator в конструктор TreeSet.
Непотокобезопасность: TreeSet не является потокобезопасным. Если несколько потоков одновременно изменяют его, требуется внешняя синхронизация.


Пример создания TreeSet:
import java.util.TreeSet;

public class TreeSetExample {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Cherry");

System.out.println(treeSet);
}
}

Этот код создаёт TreeSet, добавляет в него несколько строк и выводит их в отсортированном порядке: [Apple, Banana, Cherry].


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

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

Однако TreeSet может быть неэффективен для больших наборов данных по сравнению с HashSet, так как операции требуют дополнительных вычислений для поддержания сортировки.

Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-tree-set
https://for-each.dev/lessons/b/-java-tree-set

#Java #Training #Medium #TreeSet
Варианты ответа:
Anonymous Quiz
29%
5 2 10 7
50%
2 5 7 10
14%
2 2 5 7 7 10
7%
10 7 5 2
Что выведет код?

import java.util.TreeSet;
import java.util.Set;

public class Main {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
set.add(5);
set.add(2);
set.add(10);
set.add(7);
set.add(2);
set.add(7);

for (Integer i : set) {
System.out.print(i + " ");
}
}
}


#Tasks
А что мотивирует Вас?🧐

https://t.me/Java_for_beginner_dev

#Mems
Основные методы TreeSet и примеры использования

Добавление элементов:
boolean add(E e): Добавляет элемент в набор. Возвращает true, если элемент успешно добавлен (не был дубликатом).

Удаление элементов:
boolean remove(Object o): Удаляет элемент из набора. Возвращает true, если элемент был удалён.
void clear(): Удаляет все элементы из набора.

Поиск и получение элементов:
E first(): Возвращает первый (наименьший) элемент в наборе.
E last(): Возвращает последний (наибольший) элемент.
E lower(E e): Возвращает наибольший элемент, строго меньший чем переданный.
E higher(E e): Возвращает наименьший элемент, строго больший чем переданный.
E floor(E e): Возвращает наибольший элемент, меньший или равный переданному.
E ceiling(E e): Возвращает наименьший элемент, больший или равный переданному.
boolean contains(Object o): Проверяет, содержит ли набор указанный элемент.


Навигация и получение поднаборов:
SortedSet<E> headSet(E toElement): Возвращает поднабор от начала до элемента (исключительно).
SortedSet<E> tailSet(E fromElement): Возвращает поднабор от элемента (включительно) до конца.
SortedSet<E> subSet(E fromElement, E toElement): Возвращает поднабор от одного элемента до другого (от включительно, до исключительно).


Примеры использования методов:

1. Работа с элементами:
import java.util.TreeSet;

public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(5);
numbers.add(2);
numbers.add(10);
numbers.add(1);

System.out.println("Наименьший элемент: " + numbers.first());
System.out.println("Наибольший элемент: " + numbers.last());
System.out.println("Наибольший элемент, меньший 10: " + numbers.lower(10));
}
}
Вывод:
Наименьший элемент: 1
Наибольший элемент: 10
Наибольший элемент, меньший 10: 5


2. Получение поднаборов:
import java.util.TreeSet;

public class TreeSetSubSetExample {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Cherry");
treeSet.add("Date");
treeSet.add("Fig");

System.out.println("Поднабор до 'Cherry': " + treeSet.headSet("Cherry"));
System.out.println("Поднабор от 'Banana': " + treeSet.tailSet("Banana"));
}
}
Вывод:
Поднабор до 'Cherry': [Apple, Banana]
Поднабор от 'Banana': [Banana, Cherry, Date, Fig]


#Java #Training #Medium #TreeSet
EnumSet, особенности и внутреннее устройство

EnumSet — это специализированная реализация интерфейса Set в Java, предназначенная исключительно для работы с перечислениями (enum). Эта коллекция оптимизирована для хранения и обработки значений перечислений, обеспечивая высокую производительность и низкое потребление памяти. В отличие от других реализаций Set, таких как HashSet или LinkedHashSet, EnumSet обладает особыми свойствами, которые делают его идеальным выбором для работы с перечислениями.

Особенности EnumSet

Только для перечислений:
EnumSet работает исключительно с типами, основанными на enum. Если попытаться использовать его с любым другим типом, компилятор выбросит ошибку.

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

Порядок элементов:
EnumSet сохраняет порядок элементов в соответствии с их порядком в перечислении (enum). Этот порядок определяется положением значений в enum и никогда не изменяется.

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

Не синхронизирован:
Как и большинство коллекций в Java, EnumSet не является потокобезопасным. Для использования в многопоточной среде доступ к нему необходимо явно синхронизировать.

Внутреннее устройство EnumSet

Битовые маски:
Основной механизм, лежащий в основе EnumSet, это использование битовых масок для представления множеств значений перечисления. Каждому элементу перечисления сопоставляется определенный бит в числе. Это позволяет представлять множества элементов как набор битов.

Поддержка разных размеров перечислений:
Если количество элементов перечисления не превышает 64, EnumSet хранит все элементы в одном long. Если элементов больше, используется массив из нескольких long, чтобы вместить все возможные значения.

Типы реализаций EnumSet:

В зависимости от количества элементов в перечислении, EnumSet может использовать разные внутренние реализации:
RegularEnumSet: для небольших перечислений, где все значения могут храниться в одном long.
JumboEnumSet: для больших перечислений, где требуется использовать массив long для хранения всех значений.
Эти реализации скрыты от разработчика, так как выбор между ними осуществляется автоматически на основе размера перечисления.


Операции над множествами:
Благодаря битовому представлению, EnumSet поддерживает быстрые операции над множествами, такие как объединение, пересечение и разность. Эти операции выполняются за константное время O(1).

Сериализация:
EnumSet поддерживает сериализацию, при этом его внутреннее представление сохраняется и восстанавливается через стандартные механизмы сериализации Java.

Преимущества использования EnumSet

Производительность:
EnumSet значительно быстрее и эффективнее других реализаций Set, таких как HashSet, при работе с перечислениями. Операции добавления, удаления и проверки наличия элемента выполняются за константное время, что делает его идеальным для работы с множествами фиксированных значений.

Порядок элементов:
В отличие от HashSet, который не гарантирует порядок элементов, EnumSet сохраняет порядок, определенный в перечислении. Это упрощает работу с множествами, когда важен порядок элементов.

Экономия памяти:
Благодаря битовому представлению, EnumSet использует гораздо меньше памяти, чем другие реализации Set. Это особенно важно при работе с ограниченными ресурсами или в приложениях, где требуется высокая производительность.

Читабельность кода:
Использование EnumSet делает код более понятным и выразительным, так как он явно отражает работу с перечислениями и множествами значений.

Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-enumset
https://for-each.dev/lessons/b/-java-enumset

#Java #Training #Medium #EnumSet
Вы готовы к боли? Готовы к страданиям?😈

🫵 Думаете что сможете вырваться за рамки обыденности?
Тогда давайте попробуем порешать задачи с числами которые выходят за границы Long.


Приходите на онлайн-встречу завтра в 17:00 по МСК.
Разберём как работают классы BigInteger и BigDecimal в Java, и сделаем их аналоги чтобы решить задачи на codewars!
Что выведет код?

import java.util.EnumSet;

public class Main {
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
}

public static void main(String[] args) {
EnumSet<Day> days = EnumSet.of(Day.WEDNESDAY, Day.MONDAY, Day.FRIDAY);

for (Day day : days) {
System.out.print(day + " ");
}
}
}


#Tasks
Важный навык😂👍

https://t.me/Java_for_beginner_dev

#Mems
Основные методы EnumSet и их использование

of(E first, E... rest):
Создает EnumSet, содержащий указанные элементы перечисления.
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
Этот метод полезен, когда нужно создать множество с конкретными значениями перечисления. Порядок элементов в множестве соответствует их порядку в enum.


allOf(Class<E> elementType):
Создает EnumSet, содержащее все элементы указанного перечисления.
EnumSet<Day> allDays = EnumSet.allOf(Day.class);
Метод allOf полезен для создания множества, содержащего все возможные значения enum, что может быть полезно для инициализации настроек или параметров.


noneOf(Class<E> elementType):
Создает пустой EnumSet для указанного типа перечисления.
EnumSet<Day> noDays = EnumSet.noneOf(Day.class);
Этот метод используется, когда нужно создать пустое множество и добавлять элементы в него по мере необходимости.


range(E from, E to):
Создает EnumSet, содержащий элементы из указанного диапазона, включая границы.
EnumSet<Day> workdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
Этот метод позволяет легко создать множество с элементами, которые находятся между двумя значениями перечисления.


complementOf(EnumSet<E> s):
Создает EnumSet, содержащее все элементы, отсутствующие в указанном EnumSet.
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
EnumSet<Day> weekdays = EnumSet.complementOf(weekend);
Это полезно, когда нужно получить множество элементов, которые отсутствуют в другом множестве.


add(E e):
Добавляет указанный элемент в множество, если он еще отсутствует.
EnumSet<Day> days = EnumSet.noneOf(Day.class);
days.add(Day.MONDAY);


remove(Object o):
Удаляет указанный элемент из множества, если он присутствует.
days.remove(Day.MONDAY);


contains(Object o):
Проверяет, присутствует ли указанный элемент в множестве.
boolean isMondayIncluded = days.contains(Day.MONDAY);


isEmpty():
Проверяет, пусто ли множество.
boolean isEmpty = days.isEmpty();


size():
Возвращает количество элементов в множестве.
int size = days.size();


clear():
Удаляет все элементы из множества.
days.clear();


iterator():
Возвращает итератор для обхода элементов в множестве.
Iterator<Day> iterator = days.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}


Примеры использования EnumSet

Управление набором флагов:
EnumSet идеально подходит для управления набором флагов. Допустим, у нас есть перечисление, представляющее разрешения пользователя:
enum Permission {
READ, WRITE, EXECUTE
}

EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
permissions.add(Permission.READ);
permissions.add(Permission.WRITE);
Теперь permissions содержит флаги READ и WRITE. Это очень удобно для управления разрешениями в приложениях.


Планировщик задач:
Допустим, у нас есть задача, которая должна выполняться в определенные дни недели:
EnumSet<Day> taskDays = EnumSet.of(Day.MONDAY, Day.WEDNESDAY, Day.FRIDAY);

for (Day day : taskDays) {
System.out.println("Task scheduled on: " + day);
}
Этот код выведет дни, в которые задача должна быть выполнена.


Оптимизация кода:
Если ваш код часто работает с наборами элементов перечисления, использование EnumSet может значительно упростить и ускорить его. Например, при проверке множества состояний:
enum State {
START, RUNNING, STOP, PAUSE
}

EnumSet<State> activeStates = EnumSet.of(State.RUNNING, State.PAUSE);


#Java #Training #Medium #EnumSet
CopyOnWriteArraySet, особенности и внутреннее устройство

CopyOnWriteArraySet — это потокобезопасная реализация интерфейса Set в Java, основанная на механизме "копирование при записи" (Copy-On-Write). Эта структура данных является частью пакета java.util.concurrent, предназначенного для работы в многопоточных средах. Она предоставляет возможность безопасного использования множества элементов в условиях многопоточности без необходимости явной синхронизации.

Особенности CopyOnWriteArraySet

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

Copy-On-Write Механизм:
Механизм "копирование при записи" подразумевает, что при изменении содержимого множества создается новая копия массива, содержащего элементы. Это обеспечивает отсутствие блокировок при чтении, что повышает производительность при большом количестве потоков, выполняющих операции чтения.

Низкая производительность при изменениях:
Из-за необходимости создания новой копии массива при каждой операции изменения, CopyOnWriteArraySet не подходит для сценариев, где множество часто модифицируется. В таких случаях производительность может значительно пострадать.

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

Семантика семейств методов:
Все методы, которые изменяют коллекцию, такие как add, remove, и clear, создают новую копию массива. Методы чтения, такие как contains, iterator, и size, работают с неизменяемым массивом, что обеспечивает высокую скорость.


Внутреннее устройство CopyOnWriteArraySet

Основы внутренней реализации:
CopyOnWriteArraySet построен на основе CopyOnWriteArrayList, и его внутреннее устройство напрямую связано с этой коллекцией. Внутри CopyOnWriteArraySet содержится экземпляр CopyOnWriteArrayList, который используется для хранения элементов.
public class CopyOnWriteArraySet<E> implements Set<E>, Cloneable, Serializable {
private final CopyOnWriteArrayList<E> al;

public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}

// другие методы...
}


Гарантия уникальности элементов:

Поскольку CopyOnWriteArraySet реализует интерфейс Set, он гарантирует уникальность элементов. Для этого используется метод contains из CopyOnWriteArrayList, который проверяет, содержится ли элемент в массиве перед его добавлением.
public boolean add(E e) {
return al.addIfAbsent(e);
}


Преимущества и недостатки:

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

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

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

Гарантия уникальности элементов:
CopyOnWriteArraySet автоматически поддерживает уникальность элементов, что упрощает работу с множествами данных.

Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://javarush.com/groups/posts/1439-kak-poljhzovatjhsja-copyonwritearrayset-v-java-s-primerom-perevod
https://www.geeksforgeeks.org/copyonwritearrayset-in-java/

#Java #Training #Medium #CopyOnWriteArraySet
Что выведет код?

import java.util.concurrent.CopyOnWriteArraySet;

public class Main {
public static void main(String[] args) {
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();
set.add("one");
set.add("two");
set.add("one");
set.add("three");
set.add("two");

for (String s : set) {
System.out.print(s + " ");
}
}
}


#Tasks
Встреча создана. Для тех кто хочет просто поболтать для начала, можете присоединяться по ссылке:
https://telemost.yandex.ru/j/58955919303557

Сегодня мы попробуем решить ряд алгоритмических задач и не сойти с ума при этом🤪
Основные методы CopyOnWriteArraySet и примеры использования

add(E e):

Добавляет элемент в множество, если он отсутствует. Возвращает true, если элемент был добавлен, и false, если элемент уже присутствует в множестве.
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();
set.add("Java");
set.add("Concurrency");
boolean added = set.add("Java"); // Вернет false, так как "Java" уже есть в множестве


remove(Object o):

Удаляет указанный элемент из множества. Возвращает true, если элемент был удален, и false, если элемента не было в множестве.

boolean removed = set.remove("Java");  // Вернет true, если "Java" была удалена


contains(Object o):

Проверяет, содержится ли указанный элемент в множестве. Возвращает true, если элемент присутствует, и false, если отсутствует.
boolean contains = set.contains("Concurrency");  // Вернет true, если "Concurrency" есть в множестве


size():

Возвращает количество элементов в множестве.
int size = set.size();  // Возвращает количество элементов в множестве


isEmpty():

Проверяет, пусто ли множество. Возвращает true, если множество пусто, и false, если нет.
boolean isEmpty = set.isEmpty();  // Вернет true, если множество пусто


clear():

Удаляет все элементы из множества, оставляя его пустым.
set.clear();  // Очищает множество


iterator():

Возвращает итератор для обхода элементов в множестве. Итератор безопасен для многопоточного использования, однако не гарантирует отражение изменений, сделанных другими потоками после создания итератора.
for (String element : set) {
System.out.println(element);
}


toArray():

Преобразует множество в массив. Возвращает массив, содержащий все элементы множества.
Object[] array = set.toArray();


equals(Object o):

Проверяет, равен ли текущий набор указанному объекту. Два множества считаются равными, если они содержат одинаковые элементы.
CopyOnWriteArraySet<String> anotherSet = new CopyOnWriteArraySet<>();
boolean isEqual = set.equals(anotherSet); // Сравнивает два множества


Примеры использования CopyOnWriteArraySet


Хранение активных сессий пользователя:

В веб-приложениях можно использовать CopyOnWriteArraySet для хранения активных сессий пользователя, так как чтение информации о сессиях происходит чаще, чем их добавление или удаление.
CopyOnWriteArraySet<Session> activeSessions = new CopyOnWriteArraySet<>();

// Добавление новой сессии
activeSessions.add(newSession);

// Проверка наличия активной сессии
if (activeSessions.contains(currentSession)) {
// Обработка активной сессии
}

// Удаление завершенной сессии
activeSessions.remove(expiredSession);


Подписчики на события:
В системах, использующих паттерн "наблюдатель" (Observer), CopyOnWriteArraySet может использоваться для хранения подписчиков на события.
CopyOnWriteArraySet<EventListener> listeners = new CopyOnWriteArraySet<>();

// Добавление нового подписчика
listeners.add(newEventListener);

// Оповещение всех подписчиков о событии
for (EventListener listener : listeners) {
listener.onEvent(event);
}
Этот подход позволяет избежать проблем с одновременным изменением списка подписчиков и оповещением, обеспечивая безопасность и корректность работы в многопоточной среде.


Многопоточная работа с уникальными значениями:

CopyOnWriteArraySet идеально подходит для работы с множествами данных в многопоточной среде, где важна уникальность значений. Например, при разработке кеша для хранения уникальных запросов.
CopyOnWriteArraySet<String> queryCache = new CopyOnWriteArraySet<>();

// Добавление запроса в кеш
queryCache.add("SELECT * FROM users WHERE id=1");

// Проверка наличия запроса в кеше
if (queryCache.contains("SELECT * FROM users WHERE id=1")) {
// Обработка запроса из кеша
}


#Java #Training #Medium #CopyOnWriteArraySet