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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Основные методы 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
Уважаемые подписчики!

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


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

Ну или как минимум, напишите в комментах, почему не можете)))
Всем доброго субботнего утра! 🔆

У кого какие планы на сегодня?
Родятся ли сегодня новые pet-проекты?)))


Напоминаю, что у нас есть чат, где можно без проблем что-то спросить или просто поболтать)
https://t.me/Java_Beginner_chat

Пишите если есть вопросы!

И кроме этого, всем и каждому, замечательных выходных! 👍
Мой настольный пенал🤪😂

https://t.me/Java_for_beginner_dev

#Mems
Оглавление обучающих постов часть 1.

История и особенности языка Java
Основы синтаксиса Java
Объявление переменных
Операнды cравнения в Java
Логические операторы
Управляющие конструкции
Циклы
Массивы в Java
Массивы: Обход и основные операции
Введение в ООП и основы классов и объектов
Классы и объекты
Поля и методы класса. Конструкторы
Методы класса
Конструкторы
Статические и блоки инициализации
Инкапсуляция и модификаторы доступа
Абстракция и примеры применения
Наследование
Переопределение методов
Полиморфизм
Абстрактные классы и методы
Интерфейсы
Различия между абстрактными классами и интерфейсами
Перегрузка метода
Пакеты и импорт
Основные принципы организации классов и пакетов
Исключения: Основы
Обработка исключений
Создание собственных исключений
Вложенные и множественные catch блоки
Строки: Основные операции
Класс String и его методы
StringBuilder и StringBuffer
Разница между String, StringBuilder и StringBuffer
Collections, особенности и внутреннее устройство
Коллекции
Arrays, особенности и внутреннее устройство
List, ArrayList, LinkedList
Set, HashSet, TreeSet
Map, HashMap, TreeMap
Введение в I/O (Input/Output)
Классы File и Path
Чтение и запись файлов: FileReader, FileWriter
Буферизованные потоки: BufferedReader, BufferedWriter
Работа с байтовыми потоками: InputStream, OutputStream
Работа с буферизованными байтовыми потоками: BufferedInputStream, BufferedOutputStream
Объектные потоки: ObjectInputStream, ObjectOutputStream
Сериализация и десериализация объектов
Классы-обёртки (Wrapper classes): Integer, Double
Автоупаковка (Autoboxing) и распаковка (Unboxing)
Класс Object и его значение в Java
Другие методы класса Object
Операторы присваивания, инкремента-декремента в Java
Введение в Queue
Введение в Stack
Дженерики
Продвинутые возможности дженериков
Внутренние классы
Статические вложенные классы и примеры использования внутренних классов
Лямбда-выражения
Применение лямбда-выражений в коллекциях и Stream API
Введение в Stream API и основные методы создания стримов
Терминальные методы Stream API
Многопоточность
Использование synchronized в многопоточности
Условные переменные
Многопоточность в Java: wait и notify
Продвинутые аспекты wait и notify
Асинхронизм и Future в Java
CompletableFuture в Java
Комбинирование CompletableFuture
Многопоточность в Java: volatile и Immutable Classes
Многопоточность в Java: Deadlock
Многопоточность в Java: Пул потоков
Многопоточность в Java: ExecutorService
Concurrency
Продвинутые методы ConcurrentHashMap

#Contents
Java for Beginner pinned «Оглавление обучающих постов часть 1. История и особенности языка Java Основы синтаксиса Java Объявление переменных Операнды cравнения в Java Логические операторы Управляющие конструкции Циклы Массивы в Java Массивы: Обход и основные операции Введение в ООП…»
This media is not supported in your browser
VIEW IN TELEGRAM
Уважаемые подписчики!

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

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


Хотелось бы собрать как можно больше народу и услышать мнение каждого!🫡

Жду
всех, хотя бы на несколько минут!