🚀 Ваша CMS под контролем: легко, гибко, масштабируемо!
Управление контентом — это не просто тексты и картинки, а ключ к стабильной работе цифрового бизнеса. На открытом вебинаре вы поймете, как спроектировать CMS, которая выдержит любой трафик, и поддерживать её без лишних ресурсов.
Что вы узнаете на вебинаре:
- как грамотно проектировать структуру CMS для высокой производительности;
- какие модули и плагины помогут настроить систему под любые задачи;
- лучшие подходы к масштабированию и обеспечению стабильности на высоких нагрузках.
🔥 Спикер Евгений Тюменцев — директор компании по разработке ПО. 20 лет преподает компьютерные дисциплины в ВУЗе: C++, Kotlin, C#, ООП.
Урок проходит в преддверии курса «Microservice Architecture». Участники получат скидку на обучение!
26 ноября в 20:00 МСК. Регистрация открыта: https://vk.cc/cFafrM
Управление контентом — это не просто тексты и картинки, а ключ к стабильной работе цифрового бизнеса. На открытом вебинаре вы поймете, как спроектировать CMS, которая выдержит любой трафик, и поддерживать её без лишних ресурсов.
Что вы узнаете на вебинаре:
- как грамотно проектировать структуру CMS для высокой производительности;
- какие модули и плагины помогут настроить систему под любые задачи;
- лучшие подходы к масштабированию и обеспечению стабильности на высоких нагрузках.
🔥 Спикер Евгений Тюменцев — директор компании по разработке ПО. 20 лет преподает компьютерные дисциплины в ВУЗе: C++, Kotlin, C#, ООП.
Урок проходит в преддверии курса «Microservice Architecture». Участники получат скидку на обучение!
26 ноября в 20:00 МСК. Регистрация открыта: https://vk.cc/cFafrM
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍3❤2🔥2
Как устроен под капотом TreeSet?
TreeSet — это коллекция, которая хранит уникальные элементы и автоматически сортирует их в натуральном порядке или по заданному Comparator. Под капотом используется самобалансирующееся красно-черное дерево, которое гарантирует, что добавление, удаление и поиск элементов будут происходить за логарифмическое время. В отличие от HashSet, TreeSet не только предотвращает дублирование элементов, но и поддерживает их упорядоченность.
🔹 Структура TreeSet
В основе TreeSet лежит красно-черное дерево — структура данных, которая поддерживает балансировку после каждой операции вставки или удаления. Т.е. дерево автоматически регулирует свою форму при каждом добавлении или удалении элемента, чтобы предотвратить чрезмерное «перерастание» дерева в одну сторону.
Элементы в TreeSet хранятся в виде узлов дерева:
▪️ Каждый узел содержит ключ и ссылки на дочерние узлы
▪️ Дерево автоматически сбалансировано — максимальная глубина любого пути от корня к листу в два раза меньше самой длинной возможной
▪️ Элементы располагаются в отсортированном порядке по мере добавления, что гарантирует логарифмическую сложность поиска и вставки
🔹 Производительность
▪️ Добавление: При добавлении элемента дерево балансируется, чтобы соблюсти свойства красно-черного дерева. Это обеспечивает сложность добавления O(log n).
▪️ Удаление: Работает схожим образом — дерево ребалансируется, а ссылки между узлами корректируются. Удаление также выполняется за O(log n).
▪️ Поиск: Благодаря сбалансированной структуре, поиск элемента в TreeSet занимает O(log n), что делает его быстрее, чем линейный поиск в несбалансированных структурах.
🔹 Использование памяти
Каждый узел в TreeSet хранит не только ключ, но и ссылки на дочерние узлы (левый и правый). Это создает определенные накладные расходы по памяти, ведь для каждого элемента требуется больше памяти, чем, например, в HashSet, где хранятся лишь сами элементы.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Гарантированный порядок элементов: В отличие от HashSet, TreeSet хранит элементы в отсортированном виде. Это важно, если нужно быстро получать минимальные, максимальные или средние значения без дополнительной сортировки. Также можно извлекать диапазоны значений с помощью методов вроде subSet().
- Навигационные методы: TreeSet предоставляет мощные инструменты для навигации по набору, такие как методы для поиска ближайших элементов (floor(), ceiling()), что делает его удобным для задач с диапазонами данных.
▪️ Недостатки:
- Производительность: Операции в TreeSet медленнее, чем в HashSet.
- Большие накладные расходы по памяти: Для каждого элемента TreeSet требуется хранить дополнительные ссылки на дочерние узлы, что увеличивает потребление памяти.
@javalib #java
TreeSet — это коллекция, которая хранит уникальные элементы и автоматически сортирует их в натуральном порядке или по заданному Comparator. Под капотом используется самобалансирующееся красно-черное дерево, которое гарантирует, что добавление, удаление и поиск элементов будут происходить за логарифмическое время. В отличие от HashSet, TreeSet не только предотвращает дублирование элементов, но и поддерживает их упорядоченность.
🔹 Структура TreeSet
В основе TreeSet лежит красно-черное дерево — структура данных, которая поддерживает балансировку после каждой операции вставки или удаления. Т.е. дерево автоматически регулирует свою форму при каждом добавлении или удалении элемента, чтобы предотвратить чрезмерное «перерастание» дерева в одну сторону.
Элементы в TreeSet хранятся в виде узлов дерева:
▪️ Каждый узел содержит ключ и ссылки на дочерние узлы
▪️ Дерево автоматически сбалансировано — максимальная глубина любого пути от корня к листу в два раза меньше самой длинной возможной
▪️ Элементы располагаются в отсортированном порядке по мере добавления, что гарантирует логарифмическую сложность поиска и вставки
🔹 Производительность
▪️ Добавление: При добавлении элемента дерево балансируется, чтобы соблюсти свойства красно-черного дерева. Это обеспечивает сложность добавления O(log n).
▪️ Удаление: Работает схожим образом — дерево ребалансируется, а ссылки между узлами корректируются. Удаление также выполняется за O(log n).
▪️ Поиск: Благодаря сбалансированной структуре, поиск элемента в TreeSet занимает O(log n), что делает его быстрее, чем линейный поиск в несбалансированных структурах.
🔹 Использование памяти
Каждый узел в TreeSet хранит не только ключ, но и ссылки на дочерние узлы (левый и правый). Это создает определенные накладные расходы по памяти, ведь для каждого элемента требуется больше памяти, чем, например, в HashSet, где хранятся лишь сами элементы.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Гарантированный порядок элементов: В отличие от HashSet, TreeSet хранит элементы в отсортированном виде. Это важно, если нужно быстро получать минимальные, максимальные или средние значения без дополнительной сортировки. Также можно извлекать диапазоны значений с помощью методов вроде subSet().
- Навигационные методы: TreeSet предоставляет мощные инструменты для навигации по набору, такие как методы для поиска ближайших элементов (floor(), ceiling()), что делает его удобным для задач с диапазонами данных.
▪️ Недостатки:
- Производительность: Операции в TreeSet медленнее, чем в HashSet.
- Большие накладные расходы по памяти: Для каждого элемента TreeSet требуется хранить дополнительные ссылки на дочерние узлы, что увеличивает потребление памяти.
@javalib #java
👍18❤5🔥3
ReentrantLock vs. Lock
Lock — это интерфейс, предоставляющий базовые методы для управления синхронизацией потоков. Одной из наиболее популярных реализаций этого интерфейса является ReentrantLock, которая предлагает более широкие возможности по сравнению с базовыми реализациями. Разбираемся, в чём различие:
🔵 Повторный захват
ReentrantLock позволяет одному и тому же потоку захватывать блокировку несколько раз. Это полезно, если метод вызывается рекурсивно или используются несколько блокировок одновременно.
🔵 Больше контроля
ReentrantLock даёт больше возможностей управления блокировкой: можно настраивать справедливость (потоки захватывают блокировку по очереди) и использовать неблокирующие методы, такие как tryLock(), чтобы избежать ожидания.
🔵 Управление состоянием
С ReentrantLock блокировку можно вручную освобождать, что полезно при более сложной логике.
🔵 Дополнительные методы
ReentrantLock предоставляет такие полезные методы, как getHoldCount(), чтобы узнать, сколько раз текущий поток захватил блокировку, и isHeldByCurrentThread() для проверки, удерживается ли она этим потоком.
Используйте ReentrantLock, если вам требуется гибкость и контроль над блокировками. Lock подходит для простых случаев синхронизации.
@javalib #java
Lock — это интерфейс, предоставляющий базовые методы для управления синхронизацией потоков. Одной из наиболее популярных реализаций этого интерфейса является ReentrantLock, которая предлагает более широкие возможности по сравнению с базовыми реализациями. Разбираемся, в чём различие:
ReentrantLock позволяет одному и тому же потоку захватывать блокировку несколько раз. Это полезно, если метод вызывается рекурсивно или используются несколько блокировок одновременно.
ReentrantLock даёт больше возможностей управления блокировкой: можно настраивать справедливость (потоки захватывают блокировку по очереди) и использовать неблокирующие методы, такие как tryLock(), чтобы избежать ожидания.
С ReentrantLock блокировку можно вручную освобождать, что полезно при более сложной логике.
ReentrantLock предоставляет такие полезные методы, как getHoldCount(), чтобы узнать, сколько раз текущий поток захватил блокировку, и isHeldByCurrentThread() для проверки, удерживается ли она этим потоком.
Используйте ReentrantLock, если вам требуется гибкость и контроль над блокировками. Lock подходит для простых случаев синхронизации.
@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥5❤4
Java Bean
JavaBeans - это стандартный подход к созданию переносимых и повторно используемых компонентов. Они представляют собой классы, которые следуют определенным соглашениям и обеспечивают удобный способ управления состоянием и поведением объектов.
Основные характеристики JavaBeans:
1. Класс должен быть публичным и иметь открытый конструктор без аргументов.
2. Приватные поля класса должны быть доступны с помощью геттеров и сеттеров (
3. Класс должен быть сериализуемым, то есть должен реализовывать интерфейс
@javalib #java
JavaBeans - это стандартный подход к созданию переносимых и повторно используемых компонентов. Они представляют собой классы, которые следуют определенным соглашениям и обеспечивают удобный способ управления состоянием и поведением объектов.
Основные характеристики JavaBeans:
1. Класс должен быть публичным и иметь открытый конструктор без аргументов.
2. Приватные поля класса должны быть доступны с помощью геттеров и сеттеров (
getter
и setter
методы).3. Класс должен быть сериализуемым, то есть должен реализовывать интерфейс
Serializable
.JavaBeans
также могут иметь дополнительные свойства, такие как события и методы уведомления, которые позволяют другим компонентам реагировать на изменения состояния.@javalib #java
👍11🔥4❤3
Отложенные вычисления с помощью паттернов
Присоединяйтесь к нашему открытому уроку и погрузитесь в концепцию отложенных вычислений на основе паттернов Мост, Интерпретатор, Итератор.
Ждем вас на открытом вебинаре 28 ноября в 20:00 мск.
🚀На вебинаре вы узнаете:
1. Как и когда применять шаблоны отложенных вычислений для оптимизации производительности.
2. Практические кейсы.
🎯 Вебинар будет полезен:
• Разработчикам и инженерам, стремящимся улучшить производительность в приложениях.
• Архитекторам ПО, проектирующим масштабируемые и отказоустойчивые системы.
• Тимлидам и техническим руководителям, которые хотят повысить производительность и устойчивость решений своей команды.
В результате вебинара:
• Вы научитесь применять шаблоны Мост, Интерпретатор, Итератор.
Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники получат спец. цену на курс.
Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cFgCFl
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Присоединяйтесь к нашему открытому уроку и погрузитесь в концепцию отложенных вычислений на основе паттернов Мост, Интерпретатор, Итератор.
Ждем вас на открытом вебинаре 28 ноября в 20:00 мск.
🚀На вебинаре вы узнаете:
1. Как и когда применять шаблоны отложенных вычислений для оптимизации производительности.
2. Практические кейсы.
🎯 Вебинар будет полезен:
• Разработчикам и инженерам, стремящимся улучшить производительность в приложениях.
• Архитекторам ПО, проектирующим масштабируемые и отказоустойчивые системы.
• Тимлидам и техническим руководителям, которые хотят повысить производительность и устойчивость решений своей команды.
В результате вебинара:
• Вы научитесь применять шаблоны Мост, Интерпретатор, Итератор.
Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники получат спец. цену на курс.
Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cFgCFl
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍4❤2🔥2
Паттерн Factory (Фабрика)
Factory — это порождающий паттерн, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.
Использование:
🔹 Когда заранее неизвестны конкретные классы объектов, с которыми придётся работать.
🔹 Когда нужно централизовать логику создания объектов, чтобы избежать дублирования кода.
🔹 Когда система должна быть независимой от процесса создания, композиции и представления объектов.
Преимущества:
1️⃣ Снижает связанность кода с конкретными классами, делая систему более гибкой.
2️⃣ Улучшает структуру кода за счёт выделения логики создания объектов в отдельные классы.
3️⃣ Упрощает добавление новых типов объектов, не изменяя существующий код.
Недостатки:
1️⃣ Увеличивает количество классов в проекте, что усложняет его поддержку.
2️⃣ Требует понимания принципов абстракции и иерархий, что может усложнить первоначальное восприятие.
📌 Factory широко применяется для создания объектов в системах, где тип создаваемого объекта зависит от условий, например, в логике обработки различных пользовательских запросов или для генерации разных типов документов.
@javalib #java
Factory — это порождающий паттерн, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.
Использование:
🔹 Когда заранее неизвестны конкретные классы объектов, с которыми придётся работать.
🔹 Когда нужно централизовать логику создания объектов, чтобы избежать дублирования кода.
🔹 Когда система должна быть независимой от процесса создания, композиции и представления объектов.
Преимущества:
Недостатки:
📌 Factory широко применяется для создания объектов в системах, где тип создаваемого объекта зависит от условий, например, в логике обработки различных пользовательских запросов или для генерации разных типов документов.
@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍6❤5🍾3
🤔Введение в системный дизайн и архитектурные паттерны
Приглашаем на открытый урок, где вы познакомитесь с ключевыми концепциями системного дизайна, включая основные архитектурные паттерны для построения масштабируемых и устойчивых систем. Мы обсудим, как учитывать нефункциональные требования — производительность, надежность, безопасность — и научимся анализировать их влияние на архитектуру. Также разберем примеры из реальных кейсов, чтобы понять, как эти принципы работают на практике.
Результат: Вы получите четкое представление о базовых принципах системного дизайна и распространенных архитектурных паттернах, научитесь учитывать нефункциональные требования при проектировании, что позволит создавать оптимизированные и эффективные системы.
👉 Регистрация и подробности о курсе System Design
https://otus.pw/VVAp3/
#реклама
О рекламодателе
erid: LjN8Kax4f
Приглашаем на открытый урок, где вы познакомитесь с ключевыми концепциями системного дизайна, включая основные архитектурные паттерны для построения масштабируемых и устойчивых систем. Мы обсудим, как учитывать нефункциональные требования — производительность, надежность, безопасность — и научимся анализировать их влияние на архитектуру. Также разберем примеры из реальных кейсов, чтобы понять, как эти принципы работают на практике.
Результат: Вы получите четкое представление о базовых принципах системного дизайна и распространенных архитектурных паттернах, научитесь учитывать нефункциональные требования при проектировании, что позволит создавать оптимизированные и эффективные системы.
👉 Регистрация и подробности о курсе System Design
https://otus.pw/VVAp3/
#реклама
О рекламодателе
erid: LjN8Kax4f
👍3🔥2
ListIterator
ListIterator — это интерфейс итератора, предназначенный специально для работы со списками.
В отличие от обычного Iterator, ListIterator позволяет не только итерировать список в прямом направлении, но и в обратном.
Он поддерживает операции для перемещения вперед и назад по списку.
ListIterator реализует методы:
— next(): переход к следующему элементу.
— previous(): переход к предыдущему элементу.
— hasNext(): проверка, есть ли следующий элемент.
— hasPrevious(): проверка, есть ли предыдущий элемент.
— add(): добавление элемента в список.
ListIterator часто используется, когда нужно пройти по списку в обоих направлениях. Например, чтобы сначала обработать элементы в прямом порядке, а затем в обратном. Или чтобы вставить элементы в произвольное место списка.
@javalib #java
ListIterator — это интерфейс итератора, предназначенный специально для работы со списками.
В отличие от обычного Iterator, ListIterator позволяет не только итерировать список в прямом направлении, но и в обратном.
Он поддерживает операции для перемещения вперед и назад по списку.
ListIterator реализует методы:
— next(): переход к следующему элементу.
— previous(): переход к предыдущему элементу.
— hasNext(): проверка, есть ли следующий элемент.
— hasPrevious(): проверка, есть ли предыдущий элемент.
— add(): добавление элемента в список.
ListIterator часто используется, когда нужно пройти по списку в обоих направлениях. Например, чтобы сначала обработать элементы в прямом порядке, а затем в обратном. Или чтобы вставить элементы в произвольное место списка.
@javalib #java
👍19❤3🔥3
Что такое @Transactional в Spring?
@Transactional — это аннотация, которая управляет транзакциями в Spring. Она позволяет автоматически начать, зафиксировать или откатить транзакцию при выполнении бизнес-логики. Применяется к методам или классам, где важно обеспечить целостность данных.
🔹 Как работает:
Когда метод помечен @Transactional, Spring создает прокси-объект, который начинает транзакцию до выполнения метода и завершает её после. В случае исключения транзакция откатывается, если оно не является проверяемым (checked exception).
🔹 Конфигурации @Transactional:
▪️ Propagation (распространение):
- REQUIRED (по умолчанию): метод должен выполняться в существующей транзакции, если она есть, иначе создается новая.
- REQUIRES_NEW: всегда создает новую транзакцию, приостанавливая текущую.
- SUPPORTS: метод может выполняться в транзакции, но не требует её обязательного наличия.
- MANDATORY: требует существования транзакции, иначе будет выброшено исключение.
- NOT_SUPPORTED: метод выполняется без транзакции, даже если она существует.
- NEVER: запрещает выполнение метода в транзакции, иначе выбрасывается исключение.
- NESTED: позволяет создавать вложенные транзакции, которые могут быть откатаны отдельно от внешней.
▪️ Isolation (изолированность):
- DEFAULT: уровень изоляции БД по умолчанию.
- READ_UNCOMMITTED: минимальная изоляция, позволяет читать незавершенные изменения.
- READ_COMMITTED: запрещает чтение незавершенных транзакций.
- REPEATABLE_READ: гарантирует, что данные не изменятся во время транзакции.
- SERIALIZABLE: максимальная изоляция, исключает фантомные записи.
▪️ Timeout и Rollback:
timeout: ограничивает время выполнения транзакции (по умолчанию бесконечно).
rollbackFor/noRollbackFor: настраивают, какие исключения должны вызвать откат или нет.
🔹 Когда @Transactional не сработает?
- @Transactional не срабатывает, если метод с этой аннотацией вызывается внутри другого метода того же класса. Это связано с тем, что Spring использует прокси для управления транзакциями, и он активируется только при внешних вызовах. Когда метод вызывается из другого метода того же класса, прокси не задействуется, и транзакция не будет создана.
- Также нужно помнить, что аннотация не работает с private методами.
@javalib #java
@Transactional — это аннотация, которая управляет транзакциями в Spring. Она позволяет автоматически начать, зафиксировать или откатить транзакцию при выполнении бизнес-логики. Применяется к методам или классам, где важно обеспечить целостность данных.
🔹 Как работает:
Когда метод помечен @Transactional, Spring создает прокси-объект, который начинает транзакцию до выполнения метода и завершает её после. В случае исключения транзакция откатывается, если оно не является проверяемым (checked exception).
🔹 Конфигурации @Transactional:
▪️ Propagation (распространение):
- REQUIRED (по умолчанию): метод должен выполняться в существующей транзакции, если она есть, иначе создается новая.
- REQUIRES_NEW: всегда создает новую транзакцию, приостанавливая текущую.
- SUPPORTS: метод может выполняться в транзакции, но не требует её обязательного наличия.
- MANDATORY: требует существования транзакции, иначе будет выброшено исключение.
- NOT_SUPPORTED: метод выполняется без транзакции, даже если она существует.
- NEVER: запрещает выполнение метода в транзакции, иначе выбрасывается исключение.
- NESTED: позволяет создавать вложенные транзакции, которые могут быть откатаны отдельно от внешней.
▪️ Isolation (изолированность):
- DEFAULT: уровень изоляции БД по умолчанию.
- READ_UNCOMMITTED: минимальная изоляция, позволяет читать незавершенные изменения.
- READ_COMMITTED: запрещает чтение незавершенных транзакций.
- REPEATABLE_READ: гарантирует, что данные не изменятся во время транзакции.
- SERIALIZABLE: максимальная изоляция, исключает фантомные записи.
▪️ Timeout и Rollback:
timeout: ограничивает время выполнения транзакции (по умолчанию бесконечно).
rollbackFor/noRollbackFor: настраивают, какие исключения должны вызвать откат или нет.
🔹 Когда @Transactional не сработает?
- @Transactional не срабатывает, если метод с этой аннотацией вызывается внутри другого метода того же класса. Это связано с тем, что Spring использует прокси для управления транзакциями, и он активируется только при внешних вызовах. Когда метод вызывается из другого метода того же класса, прокси не задействуется, и транзакция не будет создана.
- Также нужно помнить, что аннотация не работает с private методами.
@javalib #java
👍26🔥10❤5
На вебинаре 4 декабря в 20:00 мск вы создадите свой первый сетевой чат на Java!
Вместе разберем, как работать с сетью, потоками и java .io.
Этот вебинар — отличная практика для начинающих.
Это ваш шанс выйти за рамки теории и сделать реальный проект, который отлично подойдет для портфолио.
Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2
Что такое механизм try-with-resources?
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
@javalib #java
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
@javalib #java
👍14❤3🔥3
Паттерн Мост (Bridge)
Bridge — это структурный паттерн, который разделяет абстракцию и её реализацию, позволяя изменять их независимо друг от друга. Это достигается созданием интерфейса (абстракции) и его конкретных реализаций, которые можно менять, не влияя на абстракцию.
Использование:
🔹 Когда нужно разделить сложные системы на отдельные, независимые части.
🔹 Когда требуется поддерживать множество вариантов реализации для одной и той же абстракции.
🔹 Когда необходимо минимизировать связанность между абстракцией и её реализацией, делая систему более гибкой и расширяемой.
Преимущества:
1️⃣ Снижает связанность между абстракцией и реализацией, что упрощает модификации.
2️⃣ Позволяет изменять реализации без изменения кода абстракции.
3️⃣ Упрощает расширение системы за счёт добавления новых абстракций и реализаций.
Недостатки:
1️⃣ Увеличивает сложность проекта из-за необходимости введения дополнительных классов.
2️⃣ Могут возникнуть трудности с отладкой, если абстракция и реализация сильно изолированы.
📌 Мост особенно полезен в случаях, когда нужно поддерживать несколько платформ или драйверов для взаимодействия с разными устройствами.
@javalib #java
Bridge — это структурный паттерн, который разделяет абстракцию и её реализацию, позволяя изменять их независимо друг от друга. Это достигается созданием интерфейса (абстракции) и его конкретных реализаций, которые можно менять, не влияя на абстракцию.
Использование:
🔹 Когда нужно разделить сложные системы на отдельные, независимые части.
🔹 Когда требуется поддерживать множество вариантов реализации для одной и той же абстракции.
🔹 Когда необходимо минимизировать связанность между абстракцией и её реализацией, делая систему более гибкой и расширяемой.
Преимущества:
Недостатки:
📌 Мост особенно полезен в случаях, когда нужно поддерживать несколько платформ или драйверов для взаимодействия с разными устройствами.
@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥6❤3🎉1
Forwarded from Java Guru 🤓
Что будет результатом кода?
Anonymous Quiz
22%
hello, hello, hello, hello
49%
hello, hello, null, null
4%
strong, strong, hello, hello
6%
strong, strong, null, null
18%
hello, hello, hello, null
👍15🔥8
Хотите разобраться в Apache Kafka и использовать её возможности для потоковой обработки данных?
На бесплатном вебинаре 28 ноября в 20:00 мск мы изучим ключевые компоненты Kafka, её архитектуру и способы настройки. Вы узнаете, как управлять кластером, подключать Kafka к приложениям и решать задачи потоковой обработки данных.
Откройте для себя технологии, которые используют лидеры отрасли для высоконагруженных систем и анализа данных в реальном времени. Этот вебинар — ваш старт в мир Big Data!
Спикер Евгений Непомнящий — опытный разработчик и преподаватель.
Участники вебинара получат скидку на большое обучение по Apache Kafka.
Регистрируйтесь на бесплатный урок и узнайте, как применять Kafka для масштабных проектов: https://vk.cc/cFmNvX
На бесплатном вебинаре 28 ноября в 20:00 мск мы изучим ключевые компоненты Kafka, её архитектуру и способы настройки. Вы узнаете, как управлять кластером, подключать Kafka к приложениям и решать задачи потоковой обработки данных.
Откройте для себя технологии, которые используют лидеры отрасли для высоконагруженных систем и анализа данных в реальном времени. Этот вебинар — ваш старт в мир Big Data!
Спикер Евгений Непомнящий — опытный разработчик и преподаватель.
Участники вебинара получат скидку на большое обучение по Apache Kafka.
Регистрируйтесь на бесплатный урок и узнайте, как применять Kafka для масштабных проектов: https://vk.cc/cFmNvX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍4❤2🔥2
Media is too big
VIEW IN TELEGRAM
Узнайте, как начать работу с java и spring framework, создав своё первое приложение всего за несколько простых шагов! В этом руководстве мы покажем, как подключить ваше приложение к mysql.
@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5👍2
⁉️ Ваши микросервисы тормозят? База данных перегружена? Решение есть — кэширование!
На открытом уроке «Кэширование в микросервисной архитектуре» мы разберём, как ускорить системы, сократить время отклика и снизить нагрузку. Вы узнаете про паттерны кэширования, типы кэшей и популярные инструменты вроде Redis и Memcached.
Представьте микросервисы, которые работают молниеносно, а база данных больше не задыхается от запросов. Ваша архитектура станет не только производительной, но и устойчивой.
🔥 Спикер Сергей Прощаев — ведущий инженер-Java-разработчик в одной из крупнейших нефтяных компаний России.
🔴 Регистрируйтесь на вебинар 11 декабря в 20:00 мск! Урок пройдёт перед стартом курса «Microservice Architecture». Только участники получат скидку на обучение: https://vk.cc/cFmQmx
На открытом уроке «Кэширование в микросервисной архитектуре» мы разберём, как ускорить системы, сократить время отклика и снизить нагрузку. Вы узнаете про паттерны кэширования, типы кэшей и популярные инструменты вроде Redis и Memcached.
Представьте микросервисы, которые работают молниеносно, а база данных больше не задыхается от запросов. Ваша архитектура станет не только производительной, но и устойчивой.
🔥 Спикер Сергей Прощаев — ведущий инженер-Java-разработчик в одной из крупнейших нефтяных компаний России.
🔴 Регистрируйтесь на вебинар 11 декабря в 20:00 мск! Урок пройдёт перед стартом курса «Microservice Architecture». Только участники получат скидку на обучение: https://vk.cc/cFmQmx
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍4❤2🔥2
Как устроен под капотом LinkedHashMap?
LinkedHashMap — это реализация интерфейса Map, которая сохраняет порядок добавления элементов. В отличие от обычного HashMap, где элементы могут быть расположены случайным образом, LinkedHashMap поддерживает последовательность вставки или порядок доступа. Это достигается благодаря использованию двусвязного списка, который связывает все элементы карты.
🔹 Структура LinkedHashMap
Основой LinkedHashMap является та же хэш-таблица, что и в HashMap, но с дополнительной структурой двусвязного списка для сохранения порядка элементов:
▪️ Каждая запись (entry) в LinkedHashMap содержит ссылки на предыдущий и следующий элементы. Это позволяет поддерживать порядок добавления или порядок последнего доступа.
▪️ Сначала выполняется хэширование ключей для быстрой вставки и поиска, как в HashMap, а уже потом запись связывается в список.
🔹 Производительность
▪️ Вставка: Добавление новых элементов выполняется за O(1), поскольку элементы добавляются в конец двусвязного списка, а хэш-таблица используется для поиска свободной позиции.
▪️ Удаление: Удаление элемента требует корректировки ссылок в двусвязном списке, что увеличивает накладные расходы, но также выполняется за O(1).
▪️ Поиск: Операция поиска по ключу происходит с использованием хэш-таблицы и выполняется за O(1), как и в HashMap.
▪️ Множественные коллизии: в худшем случае все операции будут выполняться с O(n), если допустить множественные коллизии.
🔹 Использование памяти
Каждая запись LinkedHashMap содержит дополнительные ссылки на предыдущий и следующий элементы, что увеличивает потребление памяти по сравнению с HashMap. Однако это оправдано, если важен порядок элементов.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Сохранение порядка вставки: LinkedHashMap гарантирует, что элементы будут извлекаться в том порядке, в котором они были добавлены.
- Порядок доступа: Можно настроить LinkedHashMap на удаление самых старых элементов, что полезно для кэшей, где используется политика LRU (Least Recently Used).
- Предсказуемость итераций: В отличие от HashMap, где порядок элементов может изменяться, LinkedHashMap всегда сохраняет стабильный порядок.
▪️ Недостатки:
- Более высокое потребление памяти: Дополнительные ссылки на предыдущие и следующие элементы увеличивают память на каждую запись.
- Скорость: LinkedHashMap немного медленнее HashMap из-за поддержания порядка элементов.
@javalib #java
LinkedHashMap — это реализация интерфейса Map, которая сохраняет порядок добавления элементов. В отличие от обычного HashMap, где элементы могут быть расположены случайным образом, LinkedHashMap поддерживает последовательность вставки или порядок доступа. Это достигается благодаря использованию двусвязного списка, который связывает все элементы карты.
🔹 Структура LinkedHashMap
Основой LinkedHashMap является та же хэш-таблица, что и в HashMap, но с дополнительной структурой двусвязного списка для сохранения порядка элементов:
▪️ Каждая запись (entry) в LinkedHashMap содержит ссылки на предыдущий и следующий элементы. Это позволяет поддерживать порядок добавления или порядок последнего доступа.
▪️ Сначала выполняется хэширование ключей для быстрой вставки и поиска, как в HashMap, а уже потом запись связывается в список.
🔹 Производительность
▪️ Вставка: Добавление новых элементов выполняется за O(1), поскольку элементы добавляются в конец двусвязного списка, а хэш-таблица используется для поиска свободной позиции.
▪️ Удаление: Удаление элемента требует корректировки ссылок в двусвязном списке, что увеличивает накладные расходы, но также выполняется за O(1).
▪️ Поиск: Операция поиска по ключу происходит с использованием хэш-таблицы и выполняется за O(1), как и в HashMap.
▪️ Множественные коллизии: в худшем случае все операции будут выполняться с O(n), если допустить множественные коллизии.
🔹 Использование памяти
Каждая запись LinkedHashMap содержит дополнительные ссылки на предыдущий и следующий элементы, что увеличивает потребление памяти по сравнению с HashMap. Однако это оправдано, если важен порядок элементов.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Сохранение порядка вставки: LinkedHashMap гарантирует, что элементы будут извлекаться в том порядке, в котором они были добавлены.
- Порядок доступа: Можно настроить LinkedHashMap на удаление самых старых элементов, что полезно для кэшей, где используется политика LRU (Least Recently Used).
- Предсказуемость итераций: В отличие от HashMap, где порядок элементов может изменяться, LinkedHashMap всегда сохраняет стабильный порядок.
▪️ Недостатки:
- Более высокое потребление памяти: Дополнительные ссылки на предыдущие и следующие элементы увеличивают память на каждую запись.
- Скорость: LinkedHashMap немного медленнее HashMap из-за поддержания порядка элементов.
@javalib #java
👍16❤3🔥2😁1
Java. Самое полное руководство по разработке в примерах от сообщества Stack Overflow (2024) PDF
Эта книга – не академический учебник по Java, а скорее сборник своеобразных рецептов по применению этого универсального языка программирования, которые могут пригодиться в самых разных случаях, связанных с написанием кода. Ее можно использовать для разрешения сложных ситуаций, возникающих у пользователей при работе с Java. Многое из представленного здесь материала ранее не публиковалось в русскоязычных учебниках по языку Java, например, в книге рассмотрены особенности разработки приложений на основе применения параллельного программирования, работа с потоками, а также использование Java при вызове цепочки методов.
Данное издание может стать незаменимым помощником как для начинающего программиста, стремящегося разобраться во всех тонкостях языка Java, так и для более опытных разработчиков, которые смогут использовать книгу в качестве справочника для решения повседневных задач при написании кода.
Эта книга – не академический учебник по Java, а скорее сборник своеобразных рецептов по применению этого универсального языка программирования, которые могут пригодиться в самых разных случаях, связанных с написанием кода. Ее можно использовать для разрешения сложных ситуаций, возникающих у пользователей при работе с Java. Многое из представленного здесь материала ранее не публиковалось в русскоязычных учебниках по языку Java, например, в книге рассмотрены особенности разработки приложений на основе применения параллельного программирования, работа с потоками, а также использование Java при вызове цепочки методов.
Данное издание может стать незаменимым помощником как для начинающего программиста, стремящегося разобраться во всех тонкостях языка Java, так и для более опытных разработчиков, которые смогут использовать книгу в качестве справочника для решения повседневных задач при написании кода.
👍12❤🔥4🔥2🤩1