Запись нашей вчерашней встречи -
https://youtu.be/2MVB0HK38ys
https://rutube.ru/video/45b0ddb0dd703ef3a8242154593d0898/
Спасибо тем кто смог прийти, за участие и подсказки!
@andrew_dev09 отдельный респект за то, что не постеснялся рассказать о паттернах)
На встрече, мы рассмотрели на примерах поведенческие паттерны проектирования:
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command, Transaction)
- Итератор (Iterator)
- Посредник (Mediator)
- Снимок (Memento)
- Наблюдатель (Observer)
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding
Всем доброго утра и легкой рабочей недели! 🫡✌️
https://youtu.be/2MVB0HK38ys
https://rutube.ru/video/45b0ddb0dd703ef3a8242154593d0898/
Спасибо тем кто смог прийти, за участие и подсказки!
@andrew_dev09 отдельный респект за то, что не постеснялся рассказать о паттернах)
На встрече, мы рассмотрели на примерах поведенческие паттерны проектирования:
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command, Transaction)
- Итератор (Iterator)
- Посредник (Mediator)
- Снимок (Memento)
- Наблюдатель (Observer)
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding
Всем доброго утра и легкой рабочей недели! 🫡✌️
YouTube
Поведенческие паттерны проектирования на Java. Онлайн встреча от 19.08.2024
Онлайн встреча нашего канала, которую мы провели совместно с подписчиками.
Сегодня мы рассмотрели на примерах следующие поведенческие паттерны проектирования:
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command, Transaction)
- Итератор (Iterator)…
Сегодня мы рассмотрели на примерах следующие поведенческие паттерны проектирования:
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command, Transaction)
- Итератор (Iterator)…
Media is too big
VIEW IN TELEGRAM
Для тех кто не смог победить блокировку Youtube и не желает заходить в Rutube выкладываю видео тут!
Смотрите на здоровье) 🫡
#online_meeting
Смотрите на здоровье) 🫡
#online_meeting
HashSet, особенности и внутреннее устройство
HashSet — это одна из наиболее часто используемых реализаций интерфейса Set в Java. Она обеспечивает хранение уникальных элементов и не гарантирует их порядок. Основные преимущества HashSet включают быструю вставку, удаление и проверку на наличие элемента, что делает его предпочтительным выбором для множества задач, связанных с уникальными данными.
Особенности HashSet
Уникальность элементов:
HashSet хранит только уникальные элементы. Если попытаться добавить дубликат, он будет проигнорирован.
Отсутствие упорядоченности:
В отличие от некоторых других коллекций, таких как TreeSet, HashSet не гарантирует порядка элементов. Порядок может изменяться с течением времени.
Производительность:
HashSet обеспечивает быструю производительность операций add, remove, и contains, обычно с временной сложностью O(1), что достигается за счет использования хеш-таблицы.
Разрешение коллизий:
Внутренне HashSet использует механизм разрешения коллизий, что позволяет эффективно справляться с ситуациями, когда два или более различных элемента имеют одинаковый хеш-код.
Не синхронизирован:
HashSet не является потокобезопасным. Если он используется в многопоточной среде, то необходимо явно синхронизировать доступ к нему.
Внутреннее устройство HashSet
Базовая структура данных:
HashSet основан на HashMap, где каждый элемент множества является ключом в HashMap, а значение всегда одно и то же (PRESENT, которое является статической константой).
По сути, HashSet — это оболочка над HashMap, обеспечивающая уникальность элементов за счет использования ключей.
Хеширование и корзины (buckets):
Каждый элемент, добавляемый в HashSet, сначала хешируется. Затем вычисляется индекс корзины (bucket), в которую этот элемент должен быть помещен. Корзина представляет собой связанный список или дерево, хранящее элементы с одинаковыми хеш-кодами.
На основе хеш-кода определяется индекс корзины в массиве корзин.
Если два объекта имеют одинаковый хеш-код, то они попадают в одну и ту же корзину, что приводит к коллизии.
Разрешение коллизий:
В HashMap, а соответственно и в HashSet, используется метод цепочек для разрешения коллизий. Это означает, что в случае коллизии элементы добавляются в связанный список, находящийся в соответствующей корзине.
Если количество элементов в корзине превышает определенный порог (обычно 8), связанный список преобразуется в дерево, что улучшает производительность поиска.
Перестройка (rehashing):
Когда количество элементов в HashSet достигает определенного порога (обычно при заполнении на 75%), происходит перераспределение и увеличение количества корзин, чтобы уменьшить количество коллизий. Это называется перестройкой или rehashing.
Равенство объектов:
Для корректной работы HashSet элементы должны корректно реализовывать методы equals() и hashCode(). Это необходимо для определения уникальности элементов и корректного размещения их в корзинах.
Пример кода внутреннего устройства
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://javarush.com/groups/posts/2147-hashset-v-java
https://ru.hexlet.io/qna/java/questions/kak-rabotaet-hashset-v-java
#Java #Training #Medium #HashSet
HashSet — это одна из наиболее часто используемых реализаций интерфейса Set в Java. Она обеспечивает хранение уникальных элементов и не гарантирует их порядок. Основные преимущества HashSet включают быструю вставку, удаление и проверку на наличие элемента, что делает его предпочтительным выбором для множества задач, связанных с уникальными данными.
Особенности HashSet
Уникальность элементов:
HashSet хранит только уникальные элементы. Если попытаться добавить дубликат, он будет проигнорирован.
Отсутствие упорядоченности:
В отличие от некоторых других коллекций, таких как TreeSet, HashSet не гарантирует порядка элементов. Порядок может изменяться с течением времени.
Производительность:
HashSet обеспечивает быструю производительность операций add, remove, и contains, обычно с временной сложностью O(1), что достигается за счет использования хеш-таблицы.
Разрешение коллизий:
Внутренне HashSet использует механизм разрешения коллизий, что позволяет эффективно справляться с ситуациями, когда два или более различных элемента имеют одинаковый хеш-код.
Не синхронизирован:
HashSet не является потокобезопасным. Если он используется в многопоточной среде, то необходимо явно синхронизировать доступ к нему.
Внутреннее устройство HashSet
Базовая структура данных:
HashSet основан на HashMap, где каждый элемент множества является ключом в HashMap, а значение всегда одно и то же (PRESENT, которое является статической константой).
По сути, HashSet — это оболочка над HashMap, обеспечивающая уникальность элементов за счет использования ключей.
private transient HashMap<E,Object> map;
// Заглушка значения для всех ключей
private static final Object PRESENT = new Object();
Хеширование и корзины (buckets):
Каждый элемент, добавляемый в HashSet, сначала хешируется. Затем вычисляется индекс корзины (bucket), в которую этот элемент должен быть помещен. Корзина представляет собой связанный список или дерево, хранящее элементы с одинаковыми хеш-кодами.
На основе хеш-кода определяется индекс корзины в массиве корзин.
Если два объекта имеют одинаковый хеш-код, то они попадают в одну и ту же корзину, что приводит к коллизии.
Разрешение коллизий:
В HashMap, а соответственно и в HashSet, используется метод цепочек для разрешения коллизий. Это означает, что в случае коллизии элементы добавляются в связанный список, находящийся в соответствующей корзине.
Если количество элементов в корзине превышает определенный порог (обычно 8), связанный список преобразуется в дерево, что улучшает производительность поиска.
Перестройка (rehashing):
Когда количество элементов в HashSet достигает определенного порога (обычно при заполнении на 75%), происходит перераспределение и увеличение количества корзин, чтобы уменьшить количество коллизий. Это называется перестройкой или rehashing.
Равенство объектов:
Для корректной работы HashSet элементы должны корректно реализовывать методы equals() и hashCode(). Это необходимо для определения уникальности элементов и корректного размещения их в корзинах.
Пример кода внутреннего устройства
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
// Добавление элементов
set.add("Apple");
set.add("Banana");
set.add("Orange");
// Попытка добавить дубликат
boolean isAdded = set.add("Apple"); // Вернет false, так как "Apple" уже существует
// Вывод элементов
for (String fruit : set) {
System.out.println(fruit);
}
}
}
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://javarush.com/groups/posts/2147-hashset-v-java
https://ru.hexlet.io/qna/java/questions/kak-rabotaet-hashset-v-java
#Java #Training #Medium #HashSet
JavaRush
HashSet и Set в Java
Класс HashSet реализует интерфейс Set, основан на хэш-таблице, а также поддерживается с помощью экземпляра HashMap
Что выведет код?
#Tasks
import java.util.HashSet;
public class HashSetTask {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("apple");
set.add("grape");
set.remove("banana");
set.add("pear");
System.out.println("Set size: " + set.size());
if (set.contains("orange")) {
set.remove("orange");
set.add("orange");
}
for (String fruit : set) {
System.out.print(fruit + " ");
}
}
}
#Tasks
Основные методы HashSet и их использование
add(E e):
Добавляет указанный элемент в этот набор, если он еще отсутствует.
Возвращает true, если элемент был добавлен, и false, если элемент уже присутствует в наборе.
remove(Object o):
Удаляет указанный элемент из набора, если он присутствует.
Возвращает true, если элемент был удален, и false, если его не было в наборе.
contains(Object o):
Проверяет, присутствует ли указанный элемент в наборе.
Возвращает true, если элемент присутствует, и false в противном случае.
isEmpty():
Проверяет, пуст ли набор.
Возвращает true, если набор пуст, и false в противном случае.
size():
Возвращает количество элементов в наборе.
clear():
Удаляет все элементы из набора. После вызова этого метода набор будет пустым.
iterator():
Возвращает итератор для обхода элементов в наборе.
Примеры использования HashSet
Фильтрация уникальных значений:
HashSet идеально подходит для удаления дубликатов из списка элементов. Например, чтобы извлечь уникальные слова из текста.
Множество без дубликатов в математических операциях:
В математике и информатике часто используются множества для выполнения операций, таких как пересечение, объединение и разность. HashSet идеально подходит для реализации этих операций.
Проверка на наличие дубликатов:
HashSet можно использовать для быстрой проверки, содержится ли элемент в наборе или нет. Например, для проверки уникальности данных при их вставке в базу данных.
#Java #Training #Medium #HashSet
add(E e):
Добавляет указанный элемент в этот набор, если он еще отсутствует.
Возвращает true, если элемент был добавлен, и false, если элемент уже присутствует в наборе.
HashSet<String> set = new HashSet<>();
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());
}
Примеры использования HashSet
Фильтрация уникальных значений:
HashSet идеально подходит для удаления дубликатов из списка элементов. Например, чтобы извлечь уникальные слова из текста.
String[] words = {"apple", "banana", "apple", "orange", "banana"};
HashSet<String> uniqueWords = new HashSet<>(Arrays.asList(words));
System.out.println(uniqueWords); // Вывод: [apple, banana, orange]
Множество без дубликатов в математических операциях:
В математике и информатике часто используются множества для выполнения операций, таких как пересечение, объединение и разность. HashSet идеально подходит для реализации этих операций.
HashSet<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4));
HashSet<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5, 6));
// Объединение
set1.addAll(set2);
System.out.println("Union: " + set1); // Вывод: Union: [1, 2, 3, 4, 5, 6]
// Пересечение
set1.retainAll(set2);
System.out.println("Intersection: " + set1); // Вывод: Intersection: [3, 4]
// Разность
set1.removeAll(set2);
System.out.println("Difference: " + set1); // Вывод: Difference: [1, 2]
Проверка на наличие дубликатов:
HashSet можно использовать для быстрой проверки, содержится ли элемент в наборе или нет. Например, для проверки уникальности данных при их вставке в базу данных.
HashSet<String> emails = new HashSet<>();
String newEmail = "user@example.com";
if (!emails.add(newEmail)) {
System.out.println("Этот email уже используется!");
} else {
System.out.println("Email добавлен.");
}
#Java #Training #Medium #HashSet
LinkedHashSet
LinkedHashSet — это одна из реализаций интерфейса Set в Java, которая сочетает в себе преимущества HashSet и LinkedList. Как и HashSet, LinkedHashSet гарантирует уникальность элементов, но в отличие от HashSet, он сохраняет порядок вставки элементов. Это делает его полезным в ситуациях, когда важно сохранить последовательность добавления элементов, но при этом необходимо гарантировать их уникальность.
Отличие от HashSet
Порядок элементов:
Основное отличие между LinkedHashSet и HashSet заключается в порядке элементов. В HashSet порядок элементов не гарантируется и может изменяться при выполнении операций с множеством. В LinkedHashSet же порядок элементов всегда соответствует порядку их вставки.
Дополнительные накладные расходы:
За поддержку порядка вставки приходится платить дополнительными накладными расходами на хранение связанного списка, что делает LinkedHashSet немного более ресурсоемким по сравнению с HashSet.
Использование памяти:
Внутри LinkedHashSet требует больше памяти, поскольку кроме данных элементов, он хранит ссылки на предыдущий и следующий элементы, что поддерживает связный список.
Особенности LinkedHashSet
Сохраняемый порядок вставки:
Как упоминалось ранее, порядок элементов в LinkedHashSet соответствует порядку их добавления. Это делает его полезным для реализации кешей, где порядок имеет значение, или для задач, где важна последовательность операций.
Уникальность элементов:
Как и любой другой Set, LinkedHashSet гарантирует, что каждый элемент будет уникальным. При добавлении дубликата он просто игнорируется.
Производительность:
Операции добавления, удаления, и проверки наличия элемента в LinkedHashSet имеют временную сложность O(1), аналогично HashSet. Однако из-за дополнительного управления связным списком, реальная производительность может быть несколько ниже.
Не синхронизирован:
Как и HashSet, LinkedHashSet не является потокобезопасным. Для использования в многопоточной среде доступ к нему необходимо явно синхронизировать.
Внутреннее устройство LinkedHashSet
LinkedHashSet основан на HashMap, но с дополнительным механизмом для поддержания порядка элементов.
Комбинация HashMap и LinkedList:
Внутренне LinkedHashSet использует LinkedHashMap, который сам по себе является расширением HashMap, но с добавлением двусвязного списка для хранения порядка элементов.
Каждая запись в LinkedHashMap содержит три ссылки: на ключ (элемент Set), на следующий элемент и на предыдущий элемент. Это позволяет сохранять итерируемый порядок элементов.
Порядок вставки:
В LinkedHashMap для каждого элемента поддерживается порядок вставки через двусвязный список. Это достигается с помощью дополнительных ссылок в каждом элементе: before и after, указывающих на предыдущий и следующий элементы соответственно.
Пример внутреннего устройства:
Когда вы добавляете элементы в LinkedHashSet, они хранятся в HashMap (в случае LinkedHashSet — в LinkedHashMap), и порядок вставки сохраняется в связном списке.
В данном случае элементы будут храниться и выводиться в порядке: Apple, Banana, Orange.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-linkedhashset
https://www.examclouds.com/ru/java/java-core-russian/interface-set
#Java #Training #Medium #LinkedHashSet
LinkedHashSet — это одна из реализаций интерфейса Set в Java, которая сочетает в себе преимущества HashSet и LinkedList. Как и HashSet, LinkedHashSet гарантирует уникальность элементов, но в отличие от HashSet, он сохраняет порядок вставки элементов. Это делает его полезным в ситуациях, когда важно сохранить последовательность добавления элементов, но при этом необходимо гарантировать их уникальность.
Отличие от HashSet
Порядок элементов:
Основное отличие между LinkedHashSet и HashSet заключается в порядке элементов. В HashSet порядок элементов не гарантируется и может изменяться при выполнении операций с множеством. В LinkedHashSet же порядок элементов всегда соответствует порядку их вставки.
Дополнительные накладные расходы:
За поддержку порядка вставки приходится платить дополнительными накладными расходами на хранение связанного списка, что делает LinkedHashSet немного более ресурсоемким по сравнению с HashSet.
Использование памяти:
Внутри LinkedHashSet требует больше памяти, поскольку кроме данных элементов, он хранит ссылки на предыдущий и следующий элементы, что поддерживает связный список.
Особенности LinkedHashSet
Сохраняемый порядок вставки:
Как упоминалось ранее, порядок элементов в LinkedHashSet соответствует порядку их добавления. Это делает его полезным для реализации кешей, где порядок имеет значение, или для задач, где важна последовательность операций.
Уникальность элементов:
Как и любой другой Set, LinkedHashSet гарантирует, что каждый элемент будет уникальным. При добавлении дубликата он просто игнорируется.
Производительность:
Операции добавления, удаления, и проверки наличия элемента в LinkedHashSet имеют временную сложность O(1), аналогично HashSet. Однако из-за дополнительного управления связным списком, реальная производительность может быть несколько ниже.
Не синхронизирован:
Как и HashSet, LinkedHashSet не является потокобезопасным. Для использования в многопоточной среде доступ к нему необходимо явно синхронизировать.
Внутреннее устройство LinkedHashSet
LinkedHashSet основан на HashMap, но с дополнительным механизмом для поддержания порядка элементов.
Комбинация HashMap и LinkedList:
Внутренне LinkedHashSet использует LinkedHashMap, который сам по себе является расширением HashMap, но с добавлением двусвязного списка для хранения порядка элементов.
Каждая запись в LinkedHashMap содержит три ссылки: на ключ (элемент Set), на следующий элемент и на предыдущий элемент. Это позволяет сохранять итерируемый порядок элементов.
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable {
private transient LinkedHashMap<E, Object> map;
// Значение для всех ключей в LinkedHashSet
private static final Object PRESENT = new Object();
public LinkedHashSet() {
map = new LinkedHashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
}
Порядок вставки:
В LinkedHashMap для каждого элемента поддерживается порядок вставки через двусвязный список. Это достигается с помощью дополнительных ссылок в каждом элементе: before и after, указывающих на предыдущий и следующий элементы соответственно.
Пример внутреннего устройства:
Когда вы добавляете элементы в LinkedHashSet, они хранятся в HashMap (в случае LinkedHashSet — в LinkedHashMap), и порядок вставки сохраняется в связном списке.
LinkedHashSet<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("Apple");
linkedSet.add("Banana");
linkedSet.add("Orange");
В данном случае элементы будут храниться и выводиться в порядке: Apple, Banana, Orange.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-linkedhashset
https://www.examclouds.com/ru/java/java-core-russian/interface-set
#Java #Training #Medium #LinkedHashSet
Хабр
Структуры данных в картинках. LinkedHashMap
Привет Хабрачеловеки! После затяжной паузы, я попробую продолжить визуализировать структуры данных в Java. В предыдущих статьях были замечены: ArrayList , LinkedList , HashMap . Сегодня заглянем...
Что выведет код?
#Tasks
import java.util.LinkedHashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("apple");
set.add("banana");
set.add("apple");
set.add("orange");
set.add("banana");
for (String s : set) {
System.out.print(s + " ");
}
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
25%
apple banana apple orange banana
69%
apple banana orange
0%
orange banana apple
6%
banana apple orange peer
Потом 200-метровый забег за 🍻 и регулярные старты до холодильника😂😂😂
https://t.me/Java_for_beginner_dev
#Mems
https://t.me/Java_for_beginner_dev
#Mems
Основные методы LinkedHashSet и их применение
add(E e):
Добавляет указанный элемент в множество, если он еще отсутствует.
Возвращает true, если элемент был добавлен, и false, если он уже присутствовал в множестве.
remove(Object o):
Удаляет указанный элемент из множества, если он присутствует.
Возвращает true, если элемент был удален, и false, если его не было в множестве.
contains(Object o):
Проверяет, присутствует ли указанный элемент в множестве.
Возвращает true, если элемент присутствует, и false в противном случае.
isEmpty():
Проверяет, пусто ли множество.
Возвращает true, если множество пусто, и false в противном случае.
size():
Возвращает количество элементов в множестве.
clear():
Удаляет все элементы из множества. После вызова этого метода множество будет пустым.
iterator():
Возвращает итератор для обхода элементов в множестве. Порядок обхода будет соответствовать порядку вставки элементов.
clone():
Создает поверхностную копию LinkedHashSet.
Примеры использования LinkedHashSet
Сохранение порядка уникальных элементов:
LinkedHashSet отлично подходит для ситуаций, когда важно сохранить порядок уникальных элементов, например, при обработке пользовательских данных в том порядке, в котором они были введены.
Реализация простого кеша:
LinkedHashSet может использоваться для реализации кеша, где важно сохранить порядок недавнего использования элементов.
Создание списка с исключением дубликатов:
LinkedHashSet позволяет быстро создать список уникальных элементов, сохраняя их порядок.
#Java #Training #Medium #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 поведенческих паттерна.
Кроме того, хотелось бы обсудить множество возникающих у Вас вопросов о формате подачи материала, рассматриваемых тем и будущего канала.
Хотелось бы услышать мнение лично от Вас!
Выберите время и приходите, будет интересно)))
Ну или как минимум, напишите в комментах, почему не можете)))
В это воскресение, 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:
Этот код создаёт 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
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
Baeldung
A Guide to TreeSet in Java | Baeldung
A quick and practical introduction to the TreeSet in Java.
Что выведет код?
#Tasks
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
Основные методы 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. Работа с элементами:
2. Получение поднаборов:
#Java #Training #Medium #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
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
Baeldung
Guide to EnumSet | Baeldung
Quickly learn about the EnumSet and how to start using it in practical scenarios.
Вы готовы к боли? Готовы к страданиям?😈
🫵 Думаете что сможете вырваться за рамки обыденности?
Тогда давайте попробуем порешать задачи с числами которые выходят за границы Long.
Приходите на онлайн-встречу завтра в 17:00 по МСК.
Разберём как работают классы BigInteger и BigDecimal в Java, и сделаем их аналоги чтобы решить задачи на codewars!
🫵 Думаете что сможете вырваться за рамки обыденности?
Тогда давайте попробуем порешать задачи с числами которые выходят за границы Long.
Приходите на онлайн-встречу завтра в 17:00 по МСК.
Разберём как работают классы BigInteger и BigDecimal в Java, и сделаем их аналоги чтобы решить задачи на codewars!