Java библиотека
31.6K subscribers
2.32K photos
78 videos
8 files
2.05K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
🚀 Ваша CMS под контролем: легко, гибко, масштабируемо!

Управление контентом — это не просто тексты и картинки, а ключ к стабильной работе цифрового бизнеса. На открытом вебинаре вы поймете, как спроектировать CMS, которая выдержит любой трафик, и поддерживать её без лишних ресурсов.

Что вы узнаете на вебинаре:
- как грамотно проектировать структуру CMS для высокой производительности;
- какие модули и плагины помогут настроить систему под любые задачи;
- лучшие подходы к масштабированию и обеспечению стабильности на высоких нагрузках.

🔥 Спикер Евгений Тюменцев — директор компании по разработке ПО. 20 лет преподает компьютерные дисциплины в ВУЗе: C++, Kotlin, C#, ООП.

Урок проходит в преддверии курса «Microservice Architecture». Участники получат скидку на обучение!

26 ноября в 20:00 МСК. Регистрация открыта: https://vk.cc/cFafrM

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍32🔥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
👍185🔥3
Можем ли мы перегрузить методы по возвращаемому типу?

Мы не можем перегружать по возвращаемому типу. Это поведение аналогично C++.

@javalib #java
👍13🔥2
ReentrantLock vs. Lock

Lock — это интерфейс, предоставляющий базовые методы для управления синхронизацией потоков. Одной из наиболее популярных реализаций этого интерфейса является ReentrantLock, которая предлагает более широкие возможности по сравнению с базовыми реализациями. Разбираемся, в чём различие:

🔵 Повторный захват
ReentrantLock позволяет одному и тому же потоку захватывать блокировку несколько раз. Это полезно, если метод вызывается рекурсивно или используются несколько блокировок одновременно.

🔵 Больше контроля
ReentrantLock даёт больше возможностей управления блокировкой: можно настраивать справедливость (потоки захватывают блокировку по очереди) и использовать неблокирующие методы, такие как tryLock(), чтобы избежать ожидания.

🔵 Управление состоянием
С ReentrantLock блокировку можно вручную освобождать, что полезно при более сложной логике.

🔵 Дополнительные методы
ReentrantLock предоставляет такие полезные методы, как getHoldCount(), чтобы узнать, сколько раз текущий поток захватил блокировку, и isHeldByCurrentThread() для проверки, удерживается ли она этим потоком.

Используйте ReentrantLock, если вам требуется гибкость и контроль над блокировками. Lock подходит для простых случаев синхронизации.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥54
Java Bean

JavaBeans - это стандартный подход к созданию переносимых и повторно используемых компонентов.
Они представляют собой классы, которые следуют определенным соглашениям и обеспечивают удобный способ управления состоянием и поведением объектов.

Основные характеристики JavaBeans:

1. Класс должен быть публичным и иметь открытый конструктор без аргументов.
2. Приватные поля класса должны быть доступны с помощью геттеров и сеттеров (
getter и setter методы).
3. Класс должен быть сериализуемым, то есть должен реализовывать интерфейс
Serializable.

JavaBeans также могут иметь дополнительные свойства, такие как события и методы уведомления, которые позволяют другим компонентам реагировать на изменения состояния.

@javalib #java
👍11🔥43
Отложенные вычисления с помощью паттернов

Присоединяйтесь к нашему открытому уроку и погрузитесь в концепцию отложенных вычислений на основе паттернов Мост, Интерпретатор, Итератор.

Ждем вас на открытом вебинаре 28 ноября в 20:00 мск.

🚀На вебинаре вы узнаете:

1. Как и когда применять шаблоны отложенных вычислений для оптимизации производительности.

2. Практические кейсы.

🎯 Вебинар будет полезен:

• Разработчикам и инженерам, стремящимся улучшить производительность в приложениях.

• Архитекторам ПО, проектирующим масштабируемые и отказоустойчивые системы.

• Тимлидам и техническим руководителям, которые хотят повысить производительность и устойчивость решений своей команды.

В результате вебинара:

• Вы научитесь применять шаблоны Мост, Интерпретатор, Итератор.

Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники получат спец. цену на курс.

Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cFgCFl

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍42🔥2
Паттерн Factory (Фабрика)

Factory — это порождающий паттерн, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.

Использование:

🔹 Когда заранее неизвестны конкретные классы объектов, с которыми придётся работать.
🔹 Когда нужно централизовать логику создания объектов, чтобы избежать дублирования кода.
🔹 Когда система должна быть независимой от процесса создания, композиции и представления объектов.

Преимущества:

1️⃣ Снижает связанность кода с конкретными классами, делая систему более гибкой.
2️⃣ Улучшает структуру кода за счёт выделения логики создания объектов в отдельные классы.
3️⃣ Упрощает добавление новых типов объектов, не изменяя существующий код.

Недостатки:

1️⃣ Увеличивает количество классов в проекте, что усложняет его поддержку.
2️⃣ Требует понимания принципов абстракции и иерархий, что может усложнить первоначальное восприятие.

📌 Factory широко применяется для создания объектов в системах, где тип создаваемого объекта зависит от условий, например, в логике обработки различных пользовательских запросов или для генерации разных типов документов.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍65🍾3
🤔Введение в системный дизайн и архитектурные паттерны

Приглашаем на открытый урок, где вы познакомитесь с ключевыми концепциями системного дизайна, включая основные архитектурные паттерны для построения масштабируемых и устойчивых систем. Мы обсудим, как учитывать нефункциональные требования — производительность, надежность, безопасность — и научимся анализировать их влияние на архитектуру. Также разберем примеры из реальных кейсов, чтобы понять, как эти принципы работают на практике.

Результат: Вы получите четкое представление о базовых принципах системного дизайна и распространенных архитектурных паттернах, научитесь учитывать нефункциональные требования при проектировании, что позволит создавать оптимизированные и эффективные системы.

👉 Регистрация и подробности о курсе System Design
https://otus.pw/VVAp3/

#реклама
О рекламодателе
erid: LjN8Kax4f
👍3🔥2
ListIterator

ListIterator — это интерфейс итератора, предназначенный специально для работы со списками.

В отличие от обычного Iterator, ListIterator позволяет не только итерировать список в прямом направлении, но и в обратном.
Он поддерживает операции для перемещения вперед и назад по списку.

ListIterator реализует методы:
— next(): переход к следующему элементу.
— previous(): переход к предыдущему элементу.
— hasNext(): проверка, есть ли следующий элемент.
— hasPrevious(): проверка, есть ли предыдущий элемент.
— add(): добавление элемента в список.

ListIterator часто используется, когда нужно пройти по списку в обоих направлениях. Например, чтобы сначала обработать элементы в прямом порядке, а затем в обратном. Или чтобы вставить элементы в произвольное место списка.


@javalib #java
👍193🔥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
👍26🔥105
👩‍💻 Начали путь в программировании и хотите практики?

На вебинаре 4 декабря в 20:00 мск вы создадите свой первый сетевой чат на Java!
Вместе разберем, как работать с сетью, потоками и java .io.
Этот вебинар — отличная практика для начинающих.

Это ваш шанс выйти за рамки теории и сделать реальный проект, который отлично подойдет для портфолио.

Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.

➡️ Регистрируйтесь на вебинар, погружайтесь в мир Java и получайте скидку на большое обучение «Java-разработчик»: https://vk.cc/cFk6Sd

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥2
Что такое механизм try-with-resources?

Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.

Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.


@javalib #java
👍143🔥3
Паттерн Мост (Bridge)

Bridge — это структурный паттерн, который разделяет абстракцию и её реализацию, позволяя изменять их независимо друг от друга. Это достигается созданием интерфейса (абстракции) и его конкретных реализаций, которые можно менять, не влияя на абстракцию.

Использование:


🔹 Когда нужно разделить сложные системы на отдельные, независимые части.
🔹 Когда требуется поддерживать множество вариантов реализации для одной и той же абстракции.
🔹 Когда необходимо минимизировать связанность между абстракцией и её реализацией, делая систему более гибкой и расширяемой.

Преимущества:

1️⃣ Снижает связанность между абстракцией и реализацией, что упрощает модификации.
2️⃣ Позволяет изменять реализации без изменения кода абстракции.
3️⃣ Упрощает расширение системы за счёт добавления новых абстракций и реализаций.

Недостатки:

1️⃣ Увеличивает сложность проекта из-за необходимости введения дополнительных классов.
2️⃣ Могут возникнуть трудности с отладкой, если абстракция и реализация сильно изолированы.

📌 Мост особенно полезен в случаях, когда нужно поддерживать несколько платформ или драйверов для взаимодействия с разными устройствами.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥63🎉1
Forwarded from Java Guru 🤓
Что будет результатом кода?
👍6🔥4
Хотите разобраться в Apache Kafka и использовать её возможности для потоковой обработки данных?

На бесплатном вебинаре 28 ноября в 20:00 мск мы изучим ключевые компоненты Kafka, её архитектуру и способы настройки. Вы узнаете, как управлять кластером, подключать Kafka к приложениям и решать задачи потоковой обработки данных.

Откройте для себя технологии, которые используют лидеры отрасли для высоконагруженных систем и анализа данных в реальном времени. Этот вебинар — ваш старт в мир Big Data!

Спикер Евгений Непомнящий — опытный разработчик и преподаватель.

Участники вебинара получат скидку на большое обучение по Apache Kafka.

Регистрируйтесь на бесплатный урок и узнайте, как применять Kafka для масштабных проектов: https://vk.cc/cFmNvX

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍42🔥2
Media is too big
VIEW IN TELEGRAM
👩‍💻 Твоё первое приложение на Spring Boot: Пошаговое руководство

Узнайте, как начать работу с java и spring framework, создав своё первое приложение всего за несколько простых шагов! В этом руководстве мы покажем, как подключить ваше приложение к mysql. 👨‍💻 Независимо от вашего уровня опыта, вы сможете быстро освоить основы и начать разработку. 🚀

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

@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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍42🔥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
👍163🔥2😁1
Java. Самое полное руководство по разработке в примерах от сообщества Stack Overflow (2024) PDF

Эта книга – не академический учебник по Java, а скорее сборник своеобразных рецептов по применению этого универсального языка программирования, которые могут пригодиться в самых разных случаях, связанных с написанием кода. Ее можно использовать для разрешения сложных ситуаций, возникающих у пользователей при работе с Java. Многое из представленного здесь материала ранее не публиковалось в русскоязычных учебниках по языку Java, например, в книге рассмотрены особенности разработки приложений на основе применения параллельного программирования, работа с потоками, а также использование Java при вызове цепочки методов.

Данное издание может стать незаменимым помощником как для начинающего программиста, стремящегося разобраться во всех тонкостях языка Java, так и для более опытных разработчиков, которые смогут использовать книгу в качестве справочника для решения повседневных задач при написании кода.
👍12❤‍🔥4🔥2🤩1