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
Что выведет код?

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
Фронтендеры простите😂😉

https://t.me/Java_for_beginner_dev

#Mems