Основные методы PriorityBlockingQueue и примеры использования
put(E e):
Вставляет элемент в очередь. Этот метод никогда не блокируется, так как очередь не имеет ограничений на размер.
offer(E e):
Вставляет элемент в очередь. Возвращает true, если элемент был успешно вставлен.
take():
Извлекает и удаляет элемент с наивысшим приоритетом из головы очереди. Блокируется, если очередь пуста.
poll(long timeout, TimeUnit unit):
Пытается извлечь элемент из головы очереди, блокируясь в течение указанного времени ожидания. Возвращает элемент или null, если тайм-аут истек.
peek():
Возвращает элемент с наивысшим приоритетом, но не удаляет его из очереди. Возвращает null, если очередь пуста.
size():
Возвращает количество элементов в очереди.
contains(Object o):
Проверяет, содержится ли указанный элемент в очереди.
remove(Object o):
Удаляет указанное значение из очереди, если оно присутствует.
Пример использования PriorityBlockingQueue
Обработка задач с приоритетами:
PriorityBlockingQueue можно использовать для реализации планировщика задач, где задачи с высоким приоритетом обрабатываются первыми.
#Java #Training #Medium #PriorityBlockingQueue
put(E e):
Вставляет элемент в очередь. Этот метод никогда не блокируется, так как очередь не имеет ограничений на размер.
PriorityBlockingQueue<Integer> queue = new PriorityBlockingQueue<>();
queue.put(15); // Вставка элемента в очередь
offer(E e):
Вставляет элемент в очередь. Возвращает true, если элемент был успешно вставлен.
boolean success = queue.offer(25); // Вставка элемента, возвращает true
take():
Извлекает и удаляет элемент с наивысшим приоритетом из головы очереди. Блокируется, если очередь пуста.
Integer element = queue.take(); // Блокирующее извлечение элемента
poll(long timeout, TimeUnit unit):
Пытается извлечь элемент из головы очереди, блокируясь в течение указанного времени ожидания. Возвращает элемент или null, если тайм-аут истек.
Integer polledElement = queue.poll(1, TimeUnit.SECONDS); // Пытается извлечь элемент с тайм-аутом
peek():
Возвращает элемент с наивысшим приоритетом, но не удаляет его из очереди. Возвращает null, если очередь пуста.
Integer peekedElement = queue.peek(); // Просмотр элемента без его удаления
size():
Возвращает количество элементов в очереди.
int size = queue.size(); // Получение размера очереди
contains(Object o):
Проверяет, содержится ли указанный элемент в очереди.
boolean contains = queue.contains(15); // Проверка наличия элемента в очереди
remove(Object o):
Удаляет указанное значение из очереди, если оно присутствует.
boolean removed = queue.remove(25); // Удаление элемента из очереди
Пример использования PriorityBlockingQueue
Обработка задач с приоритетами:
PriorityBlockingQueue можно использовать для реализации планировщика задач, где задачи с высоким приоритетом обрабатываются первыми.
import java.util.concurrent.PriorityBlockingQueue;
class Task implements Comparable<Task> {
private int priority;
private String name;
public Task(int priority, String name) {
this.priority = priority;
this.name = name;
}
@Override
public int compareTo(Task other) {
return Integer.compare(this.priority, other.priority);
}
@Override
public String toString() {
return "Task{name='" + name + "', priority=" + priority + '}';
}
}
public class TaskScheduler {
public static void main(String[] args) throws InterruptedException {
PriorityBlockingQueue<Task> taskQueue = new PriorityBlockingQueue<>();
taskQueue.put(new Task(3, "Low priority task"));
taskQueue.put(new Task(1, "High priority task"));
taskQueue.put(new Task(2, "Medium priority task"));
while (!taskQueue.isEmpty()) {
Task task = taskQueue.take();
System.out.println("Processing " + task);
}
}
}
#Java #Training #Medium #PriorityBlockingQueue
Запись нашей вчерашней встречи -
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.