Варианты ответа:
Anonymous Quiz
0%
one two one three two
78%
one two three
11%
three two one
11%
two one three
Что выведет код?
#Tasks
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
Сегодня мы попробуем решить ряд алгоритмических задач и не сойти с ума при этом🤪
https://telemost.yandex.ru/j/58955919303557
Сегодня мы попробуем решить ряд алгоритмических задач и не сойти с ума при этом🤪
telemost.yandex.ru
Яндекс Телемост
Видеовстречи по ссылке. Собирайте в Телемосте рабочие конференции или встречайтесь с друзьями. Встречи не ограничены по времени. Можно скачать Телемост для Windows или macOS.
Основные методы CopyOnWriteArraySet и примеры использования
add(E e):
Добавляет элемент в множество, если он отсутствует. Возвращает true, если элемент был добавлен, и false, если элемент уже присутствует в множестве.
remove(Object o):
Удаляет указанный элемент из множества. Возвращает true, если элемент был удален, и false, если элемента не было в множестве.
contains(Object o):
Проверяет, содержится ли указанный элемент в множестве. Возвращает true, если элемент присутствует, и false, если отсутствует.
size():
Возвращает количество элементов в множестве.
isEmpty():
Проверяет, пусто ли множество. Возвращает true, если множество пусто, и false, если нет.
clear():
Удаляет все элементы из множества, оставляя его пустым.
iterator():
Возвращает итератор для обхода элементов в множестве. Итератор безопасен для многопоточного использования, однако не гарантирует отражение изменений, сделанных другими потоками после создания итератора.
toArray():
Преобразует множество в массив. Возвращает массив, содержащий все элементы множества.
equals(Object o):
Проверяет, равен ли текущий набор указанному объекту. Два множества считаются равными, если они содержат одинаковые элементы.
Примеры использования CopyOnWriteArraySet
Хранение активных сессий пользователя:
В веб-приложениях можно использовать CopyOnWriteArraySet для хранения активных сессий пользователя, так как чтение информации о сессиях происходит чаще, чем их добавление или удаление.
Подписчики на события:
В системах, использующих паттерн "наблюдатель" (Observer), CopyOnWriteArraySet может использоваться для хранения подписчиков на события.
Многопоточная работа с уникальными значениями:
CopyOnWriteArraySet идеально подходит для работы с множествами данных в многопоточной среде, где важна уникальность значений. Например, при разработке кеша для хранения уникальных запросов.
#Java #Training #Medium #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 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.
Хотелось бы услышать мнение лично от Вас!
Ждем всех, хотя бы на несколько минут!
Ну или как минимум, напишите в комментах, почему не можете)))
В воскресение, в 16:00 по МСК, мы вновь соберемся для онлайн встречи и будем рассматривать последние 4 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.
Хотелось бы услышать мнение лично от Вас!
Ждем всех, хотя бы на несколько минут!
Всем доброго субботнего утра! 🔆
У кого какие планы на сегодня?
Родятся ли сегодня новые pet-проекты?)))
Напоминаю, что у нас есть чат, где можно без проблем что-то спросить или просто поболтать)
https://t.me/Java_Beginner_chat
Пишите если есть вопросы!
И кроме этого, всем и каждому, замечательных выходных! 👍
У кого какие планы на сегодня?
Родятся ли сегодня новые pet-проекты?)))
Напоминаю, что у нас есть чат, где можно без проблем что-то спросить или просто поболтать)
https://t.me/Java_Beginner_chat
Пишите если есть вопросы!
И кроме этого, всем и каждому, замечательных выходных! 👍
Оглавление обучающих постов часть 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
Основы синтаксиса 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 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.
Хотелось бы собрать как можно больше народу и услышать мнение каждого!🫡
Жду всех, хотя бы на несколько минут!
Напоминаю, что сегодня в 16:00 по МСК, мы вновь соберемся на онлайн встречу и будем рассматривать последние 4 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.
Хотелось бы собрать как можно больше народу и услышать мнение каждого!🫡
Жду всех, хотя бы на несколько минут!
Запись нашей вчерашней встречи -
YOUTUBE
RUTUBE
Спасибо тем кто смог прийти, за участие, вопросы и подсказки! Оценил!
Жаль, что все таки для обсуждения пришло не так много участников как хотелось. 😐
На встрече, мы рассмотрели на примерах последние из поведенческих паттернов проектирования:
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template Method)
- Посетитель (Visitor)
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding
Всем доброго утра и легкой рабочей недели! 🫡✌️
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
Смотрите на здоровье) 🫡
#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.
Динамическое расширение массива:
Когда в BitSet устанавливается бит с индексом, превышающим текущий размер массива words, происходит расширение массива.
Битовые операции:
Основные битовые операции (AND, OR, XOR, NOT) выполняются непосредственно на массиве long[], что обеспечивает высокую производительность. Например, операция AND проходит по каждому элементу массива words и применяет побитовую операцию AND:
Индексация битов:
Для работы с конкретными битами внутри BitSet, используется индексация. Индекс бита определяет, в каком элементе массива words он находится, и его позицию внутри этого элемента.
Эффективное использование памяти и производительности:
Благодаря использованию long[], BitSet позволяет эффективно управлять памятью, особенно при работе с большими наборами данных. Битовые операции выполняются быстро, что делает этот класс пригодным для задач, требующих высокой производительности.
#Java #Training #Medium #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!💪
Дальше будет интереснее....😏
Ребят, я не знаю, как и зачем Вы к нам пришли, но по всей видимости Вы что-то ищете и ждете от нашего канала.
Я всеми силами буду стараться это Вам дать, и продолжать обучать и самообучаться Java дальше!🫡
Независимо от всего этого я искренне благодарен всем, кто находится здесь, приходит на встречи, интересуется и пишет комментарии, участвует в обсуждениях в чате!
Спасибо ребят!🤝
Давайте и дальше становиться лучшим пабликом для изучающих Java!💪
Дальше будет интереснее....😏
Что выведет код?
#Tasks
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