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

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

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

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


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

Жду
всех, хотя бы на несколько минут!
Запись нашей вчерашней встречи -
YOUTUBE
RUTUBE

Спасибо тем кто смог прийти, за участие, вопросы и подсказки! Оценил!

Жаль, что все таки для обсуждения пришло не так много участников как хотелось. 😐

На встрече, мы рассмотрели на примерах последние из поведенческих паттернов проектирования:
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template Method)
- Посетитель (Visitor)


Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding

Всем доброго утра и легкой рабочей недели! 🫡✌️
Встреча_в_Телемосте_25_08_24_20_02_39_—_запись.webm
142.1 MB
Для тех кто не смог победить блокировку Youtube и не желает заходить в Rutube выкладываю видео тут!

Смотрите на здоровье) 🫡

#online_meeting
BitSet, особенности и внутреннее устройство

BitSet — это класс в Java, который представляет собой массив битов с возможностью их динамического увеличения. Он используется для эффективного хранения и манипулирования наборами булевых значений (битов), где каждый бит может быть true (1) или false (0). BitSet принадлежит к пакету java.util и является полезным инструментом для выполнения операций на уровне битов, таких как поиск битовых масок, управление множествами, или работа с флагами.

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

Эффективное использование памяти:
BitSet предназначен для экономии памяти. В отличие от массивов типа boolean[], где каждый элемент занимает 1 байт, BitSet использует один бит на каждое значение, что значительно снижает объем памяти, требуемой для хранения большого количества булевых значений.

Динамическое расширение:
BitSet динамически изменяет размер своего внутреннего хранилища по мере добавления или изменения значений. Это позволяет работать с большими наборами битов без необходимости заранее задавать их размер.

Быстрые битовые операции:
BitSet предоставляет быстрые методы для выполнения битовых операций, таких как AND, OR, XOR, и NOT. Эти операции применяются ко всему набору битов, что делает BitSet мощным инструментом для задач, требующих обработки множества булевых значений.

Легкость использования:
BitSet предоставляет удобные методы для установки, сброса, проверки и изменения битов по их индексам. Это упрощает работу с булевыми массивами и делает код более читаемым.
Внутреннее устройство BitSet

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

Основная структура данных:

Основой BitSet является массив long[]. Каждый элемент этого массива представляет собой 64 бита, которые могут быть установлены в 0 или 1.
public class BitSet implements Cloneable, Serializable {
private long[] words;
private int wordsInUse = 0;
// другие поля и методы...
}
Массив words динамически расширяется по мере необходимости. Параметр wordsInUse отслеживает количество используемых элементов в массиве.


Динамическое расширение массива:

Когда в BitSet устанавливается бит с индексом, превышающим текущий размер массива words, происходит расширение массива.
private void ensureCapacity(int wordsRequired) {
if (words.length < wordsRequired) {
// логика увеличения размера массива...
}
}
Этот процесс автоматический и управляется самим классом BitSet, что позволяет пользователю не беспокоиться о ручном управлении памятью.


Битовые операции:

Основные битовые операции (AND, OR, XOR, NOT) выполняются непосредственно на массиве long[], что обеспечивает высокую производительность. Например, операция AND проходит по каждому элементу массива words и применяет побитовую операцию AND:
public void and(BitSet set) {
for (int i = 0; i < wordsInUse; i++) {
words[i] &= set.words[i];
}
recalculateWordsInUse();
}
Это позволяет применять операции ко всему набору битов за один проход, минимизируя затраты времени.


Индексация битов:

Для работы с конкретными битами внутри BitSet, используется индексация. Индекс бита определяет, в каком элементе массива words он находится, и его позицию внутри этого элемента.
private static int wordIndex(int bitIndex) {
return bitIndex >> 6; // Эквивалентно делению на 64
}

public void set(int bitIndex) {
int wordIndex = wordIndex(bitIndex);
words[wordIndex] |= (1L << bitIndex);
}
Здесь метод wordIndex вычисляет индекс элемента массива, в котором находится нужный бит, а побитовый сдвиг устанавливает значение этого бита.


Эффективное использование памяти и производительности:

Благодаря использованию long[], BitSet позволяет эффективно управлять памятью, особенно при работе с большими наборами данных. Битовые операции выполняются быстро, что делает этот класс пригодным для задач, требующих высокой производительности.

#Java #Training #Medium #BitSet
❗️❗️❗️2️⃣0️⃣0️⃣ подписчиков!!! ❗️❗️❗️

Ребят, я не знаю, как и зачем Вы к нам пришли, но по всей видимости Вы что-то ищете и ждете от нашего канала.

Я всеми силами буду стараться это Вам дать, и продолжать обучать и самообучаться Java дальше!🫡


Независимо от всего этого я искренне благодарен всем, кто находится здесь, приходит на встречи, интересуется и пишет комментарии, участвует в обсуждениях в чате!

Спасибо ребят!🤝

Давайте и дальше становиться лучшим пабликом для изучающих Java!💪

Дальше будет интереснее....😏
Что выведет код?

import java.util.BitSet;

public class Main {
public static void main(String[] args) {
BitSet bitset = new BitSet(10);
bitset.set(0);
bitset.set(3);
bitset.set(5);
bitset.set(7);
bitset.flip(0, 6);
bitset.clear(7);

for (int i = 0; i < 10; i++) {
System.out.print(bitset.get(i) ? "1" : "0");
}
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
33%
1101000000
0%
0101010000
33%
0110100000
33%
0110101000