java_iibrary | Unsorted

Telegram-канал java_iibrary - Java Portal | Программирование

12073

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg

Subscribe to a channel

Java Portal | Программирование

В Spring Boot ProductController нужно обработать два разных случая:

1. Вернуть простой 404 Not Found, если продукт не найден.

2. Вернуть 201 Created с динамическим заголовком Location при успешном создании.

Какие механизмы Spring вы бы использовали для реализации каждого из этих требований и почему?

Два основных способа управлять HTTP-ответом, отправляемым клиенту:

→ @ResponseStatus: простой статический вариант

- Можно навесить на исключение или метод контроллера.

- Всегда возвращает один и тот же HTTP-статус.

- Подход "fire-and-forget": быстро и лаконично в случаях, когда ответ всегда одинаковый.

- Лучше всего подходит для простой обработки ошибок. Например, ResourceNotFoundException, аннотированный @ResponseStatus(HttpStatus.NOT_FOUND), всегда будет возвращать 404.

- Нельзя добавить кастомные заголовки или динамическое тело ответа.

→ ResponseEntity: кастомный инструмент

- Даёт полный программный контроль над формированием HTTP-ответа во время выполнения.

- Можно выставить статус, добавить заголовки и собрать тело ответа так, как требуется по логике.

- Лучше всего подходит для сложных ответов. Например, когда нужно добавить заголовок Location после создания ресурса (201 Created) или вернуть детализированный JSON-объект с информацией об ошибке.

- Это основной инструмент, когда ответ должен зависеть от ситуации.

Комбинация подходов:

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

CQRS — один из самых популярных вопросов на собеседованиях Java/backend-разработчиков, связанных с взаимодействием микросервисов.

При этом обычно не задают вопрос в формате «Дайте определение CQRS», а формулируют его через реальный сценарий.

Сценарий:

Сервис заказов на e-commerce платформе в данный момент обрабатывает все операции (массовое создание и обновление заказов, поиск заказов клиентов, формирование сложных отчётов по продажам) через одну общую реляционную базу данных.
Во время пиковых нагрузок тяжёлые отчётные запросы вызывают серьёзные замедления транзакционных операций, что ухудшает пользовательский опыт. Кроме того, сама модель данных заказов становится чрезмерно сложной, пытаясь одновременно удовлетворить разные потребности.


Вопросы:

Определите проблему: Какую ключевую архитектурную проблему этот пример демонстрирует в части работы с данными и почему единая модель данных не справляется?

Предложите решение: Как вы бы переработали этот сервис, чтобы устранить проблемы с производительностью и избыточной сложностью? Назовите архитектурный паттерн и его основной принцип.

Ответ:

CQRS решает эту задачу за счёт разделения моделей и баз данных для записи и чтения.

Запись (заказы): команды обновляют выделенную нормализованную базу для записи (оптимизированную под транзакции).

Чтение (отчёты): события записи асинхронно обновляют отдельную денормализованную базу для чтения (оптимизированную под быстрые запросы и отчётность).

CQRS чаще всего реализуется с использованием брокера сообщений.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Модернизация алгоритмов: От наивного → оптимального

🔸Two Sum (пара с заданной суммой)
Наивно: O(n²) — двойной цикл
Оптимально: O(n) с использованием HashMap

🔸Find Duplicate Number (найти дубликат, 1 ≤ num ≤ n)
Наивно: HashSet или дополнительная память
Оптимально: Обнаружение цикла Флойда (O(1) по памяти)

🔸Kth Largest Element (k-й по величине элемент)
Наивно: Сортировка массива (O(n log n))
Оптимально: QuickSelect (в среднем O(n)) или куча (Heap)

🔸Longest Palindromic Substring (длиннейшая палиндромная подстрока)
Наивно: O(n³) — перебор всех подстрок
Оптимально: Расширение из центра (Expand Around Center, O(n²)), или алгоритм Манакера (O(n))

🔸Max Subarray Sum (максимальная сумма подмассива)
Наивно: Генерация всех подмассивов
Оптимально: Алгоритм Кадане (Kadane’s Algorithm, O(n))

🔸All Pairs Shortest Paths (кратчайшие пути между всеми вершинами)
Наивно: Запускать Dijkstra для каждой вершины
Оптимально: Алгоритм Флойда–Уоршелла (Floyd-Warshall, O(V³)), эффективен для плотных графов

🔸Median in Data Stream (медиана в потоке данных)
Наивно: Сортировать после каждой вставки
Оптимально: Две кучи (Min Heap и Max Heap), вставка за O(log n)

🔸Valid Anagram (анаграмма?)
Наивно: Сортировка строк
Оптимально: Подсчёт частот символов в массиве (O(n))

🔸Permutations (перестановки)
Наивно: Сгенерировать и сохранить все перестановки
Оптимально: Рекурсивный Backtracking с отсечениями

🔸Subset Sum Exists (проверка, существует ли сумма из подмножества)
Наивно: Перебор всех подмножеств (2ⁿ)
Оптимально: Динамическое программирование — снизу вверх или с мемоизацией

🔸Product of Array Except Self (произведение всех кроме текущего)
Наивно: Умножать все кроме текущего, O(n²)
Оптимально: Префикс + суффикс произведения (O(n))

🔸Shortest Unsorted Subarray (самый короткий несортированный подмассив)
Наивно: Сортировка и сравнение
Оптимально: Два указателя для границ (O(n))

🔸Min Window Substring (минимальная подстрока с нужными символами)
Наивно: Перебор всех подстрок
Оптимально: Sliding Window + HashMap, O(n)

🔸Search in Rotated Array (поиск в повернутом массиве)
Наивно: Линейный поиск
Оптимально: Модифицированный бинарный поиск

🔸Count Inversions (подсчёт инверсий)
Наивно: Вложенные циклы, O(n²)
Оптимально: Модифицированный Merge Sort, O(n log n)

🔸Check if Tree is Balanced (проверка сбалансированности дерева)
Наивно: Пересчитывать высоту на каждом шаге
Оптимально: Один проход — возвращаем высоту и статус баланса

🔸Merge k Sorted Lists (слияние k отсортированных списков)
Наивно: Объединить всё и отсортировать
Оптимально: Слияние k списков через Min Heap, O(N log k)

🔸Longest Consecutive Sequence (длиннейшая последовательность чисел)
Наивно: Сортировка и проход
Оптимально: HashSet + сканирование, O(n)

🔸Word Ladder (преобразование слов)
Наивно: BFS от каждого слова
Оптимально: Предобработка + двусторонний BFS

🔸Number of Islands (количество островов)
Наивно: DFS без отметок
Оптимально: DFS/BFS/Union-Find с отслеживанием посещённых клеток

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💲Каналы с Junior IT вакансиями и стажировками
Подписывайся и забирай свой оффер⚡

1. IT вакансии по СНГ
2. IT стажировки по СНГ
3. IT стажировки в топовых компаниях мира
4. Удалённые IT вакансии и стажировки
5. Python вакансии и стажировки
6. БИГТЕХ вакансии и стажировки
7. Design вакансии и стажировки
8. QA вакансии и стажировки
9. Junior вакансии и стажировки
10. Frontend вакансии и вопросы собесов
11. Вакансии и стажировки для аналитиков
12. Вакансии в русских стартапах за границей
13. Вакансии и стажировки для DevOps
14. Вакансии, которых нет на ХХ.РУ

Читать полностью…

Java Portal | Программирование

Лучший способ использовать аннотацию Spring Transactional

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Лучшие практики для микросервисов

1. Отдельное хранилище данных
🔸Каждый микросервис должен использовать свою собственную базу данных, чтобы обеспечить изоляцию данных и слабую связанность.

2. Единый уровень зрелости кода
🔸Старайтесь поддерживать код всех сервисов примерно на одинаковом уровне зрелости (тестируемость, покрытие, качество).

3. Отдельная сборка для каждого микросервиса
🔸У каждого сервиса должна быть своя сборочная цепочка (CI/CD pipeline), чтобы обеспечить независимость деплоя.

4. Принцип единственной ответственности
🔸Один сервис — одна бизнес-задача. Не смешивайте домены и обязанности в рамках одного микросервиса.

5. Развёртывание в контейнерах
🔸Используйте контейнеры (например, Docker) для упаковки и запуска каждого микросервиса независимо.

6. Обрабатывайте серверы как статeless
🔸Сервисы не должны хранить состояние между запросами. Состояние — либо в БД, либо во внешнем хранилище.

7. Domain-Driven Design (DDD)
🔸Стройте архитектуру на основе бизнес-домена: делите систему на логически обоснованные сервисы, а не технические модули.

8. Микрофронтенд
🔸Разделяйте frontend-приложения по тому же принципу, что и backend: независимые фронты взаимодействуют через API Gateway.

9. Оркестрация микросервисов
🔸Используйте системы оркестрации (например, Kubernetes), чтобы управлять масштабированием, деплоем и связью между сервисами.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Лучшие практики работы с транзакциями Spring

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Лучший способ использовать методы запросов Spring Data

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Коллекция диаграмм по софту и программированию от ByteByteGo

✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только

→ https://github.com/ByteByteGoHq/system-design-101

Идеально для подготовки к техническим интервью 😳

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Лучшие способы логировать SQL-запросы в Spring Boot

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Как работает HashMap в Java?

1. Внутреннее устройство – https://javarevisited.blogspot.com/2010/02/how-hashmap-works-in-java.html
2. Механика методов get и put – https://java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Чувак сделал минималистичный лаунчер для Minecraft для личного использования.

Теперь, когда кто-то из друзей спрашивает, какой лаунчер посоветуешь без вирусов — просто кидаю им свой :P


Ссылки на скачивание и исходники (если интересно, как такой написать):

🔹Скачать: https://github.com/sammwyy/MiniLaunch/releases
(Жми на ссылку с именем minilaunch.jar)

🔹Исходный код лаунчера на Java:
https://github.com/sammwyy/MiniLaunch

После скачивания просто дважды кликни по .jar, и всё готово

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Профилирование JDBC с помощью VisualVM

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Сборка мусора в JVM — всё, что нужно знать

1. Сборка мусора (GC) → Автоматическая очистка памяти

🔸JVM автоматически освобождает память от недостижимых объектов.
🔸Используется для избегания ручного управления памятью (например, неиспользуемые объекты List очищаются автоматически).

2. Heap → Основная область памяти для объектов

🔸Здесь хранятся все объекты Java.
🔸Делится на области: Young, Old и иногда Metaspace.

3. Молодое поколение (Young Generation) → Новые объекты (краткоживущие)

🔸Большинство новых объектов создаются здесь.
🔸Пример использования: String s = "abc" сначала попадает в эту область.

4. Старое поколение (Old Generation / Tenured) → Долгоживущие объекты

🔸Объекты, пережившие несколько сборок мусора, перемещаются сюда.
🔸Пример использования: кэшированные конфигурации, бины, живущие на протяжении всей жизни приложения.

5. Metaspace → Хранение метаданных классов (начиная с Java 8+)

🔸Заменяет PermGen.
🔸Хранит структуру классов, информацию о методах (например, User.class, List.class).

6. Minor GC → Очистка молодого поколения

🔸Быстрая и частая.
🔸Срабатывает, когда заполняется пространство Eden (например, при множестве краткоживущих запросов).

7. Major (Full) GC → Очистка старого поколения и Metaspace

🔸Медленнее и реже.
🔸Срабатывает, когда почти заполнено старое поколение (например, при больших графах объектов или утечках памяти).

8. Stop-the-World (STW) → Приостановка приложения во время GC

🔸JVM замораживает все потоки на время GC.
🔸Может вызывать задержки (например, при большой полной сборке мусора).

9. GC Roots → Точки отсчета для достижимости объектов

🔸Включает ссылки из регистров, стэков потоков, загрузчиков классов.
🔸GC отслеживает от них «живые» объекты (например, локальные переменные в методе main()).

Основные типы сборщиков мусора

10. Serial GC → Однопоточный сборщик

🔸Простой, но останавливает всё приложение.
🔸Используется для малых heaps (например, CLI-инструменты или тестовые приложения).

11. Parallel GC → Многопоточный сборщик

🔸Ускоряет GC за счёт многопоточности.
🔸Используется в приложениях с приоритетом на производительность (например, batch-задачи, нагруженные серверы).

12. CMS (Concurrent Mark Sweep) → Сборщик с низкими паузами (УСТАРЕЛ)

🔸Работает в фоновом режиме с короткими паузами.
🔸Использовался в приложениях, чувствительных к задержкам (например, веб-серверы).

13. G1 GC → Сбалансированный сборщик с низкими паузами (по умолчанию с Java 9+)

🔸Делит heap на регионы; работает параллельно и конкурентно.
🔸Отличный универсальный сборщик (например, для микросервисов, real-time API).

14. ZGC → Сборщик с ультранизкими паузами

🔸Разработан для пауз в пределах миллисекунды.
🔸Используется в системах реального времени с большим heap (например, финтех, игры).

15. Shenandoah → Сборщик с низкими паузами (RedHat/OpenJDK)

🔸Конкурирует с ZGC.
🔸Применяется в больших heaps с постоянными требованиями к задержкам.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

14 советов для высокопроизводительной персистентности в Java

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Проект JDBG от roger1337 позволяет подключаться к JVM во время выполнения и исследовать внутреннее состояние Java-программы.

Инструмент использует JNI + JVMTI + DLL-инъекцию, поддерживает просмотр классов, байткода, стека вызовов, локальных переменных и экземпляров объектов.

Создан для исследовательских и образовательных целей, под лицензией Apache 2.0.

https://github.com/roger1337/JDBG

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot + Swagger

Документирование API без лишней головной боли.

Полное руководство читай здесь: тык

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Запрос Hibernate WITH RECURSIVE

⏩Читать подробнее

👉 Java Portal | #cтатья

Читать полностью…

Java Portal | Программирование

Algorithmic Thinking Patterns

🔸Паттерн: Two Pointers
Суть идеи: Ввести два индекса и двигать их по массиву
Когда использовать: Отсортированные массивы, удаление дубликатов, реверс
Типовые задачи: Reverse array in-place, 3Sum, Remove Duplicates

🔸Паттерн: Sliding Window
Суть идеи: Оптимизация задач на подмассивы путём расширения/сжатия окна
Когда использовать: Строки, макс/мин в окне, шаблоны фиксированной длины
Типовые задачи: Longest substring w/o repeats, Max sum of k-size subarray

🔸Паттерн: Binary Search on Answer
Суть идеи: Вместо поиска элемента ищем min/max значение, удовлетворяющее условию
Когда использовать: Монотонное пространство поиска
Типовые задачи: Min eating speed, Aggressive cows, Capacity to ship packages

🔸Паттерн: Prefix Sum / Difference Array
Суть идеи: Предобработка для ответов на запросы за O(1)
Когда использовать: Сумма/частота на интервалах, перекрывающиеся диапазоны
Типовые задачи: Subarray sum = K, Difference array for range updates

🔸Паттерн: Greedy
Суть идеи: Выбираем на каждом шаге локально лучший вариант, надеясь на глобальный оптимум
Когда использовать: Когда выбор можно отсортировать или сравнить
Типовые задачи: Activity selection, Gas Station, Jump Game

🔸Паттерн: Backtracking
Суть идеи: Перебираем все варианты и откатываемся с неверных путей
Когда использовать: Комбинации, перестановки, ограничения
Типовые задачи: N-Queens, Sudoku Solver, Subset Sum

🔸Паттерн: Bitmasking
Суть идеи: Используем биты для представления подмножеств или флагов
Когда использовать: Маленькие N (N ≤ 20), переключаем состояния
Типовые задачи: Count set bits, Subset sum, Traveling Salesman

🔸Паттерн: Union-Find (DSU)
Суть идеи: Эффективно объединяем и находим компоненты
Когда использовать: Связность, обнаружение циклов
Типовые задачи: Number of Provinces, Kruskal's MST, Friend Circles

🔸Паттерн: Monotonic Stack / Queue
Суть идеи: Поддерживаем монотонно возрастающую или убывающую структуру
Когда использовать: Следующий больше/меньше, максимум по диапазону
Типовые задачи: Daily Temperatures, Largest rectangle in histogram

🔸Паттерн: Topological Sort
Суть идеи: Линейный порядок задач по зависимостям
Когда использовать: Ацикличные графы (DAG), планирование
Типовые задачи: Course Schedule, Build Order, Alien Dictionary

🔸Паттерн: Dynamic Programming (Tabulation)
Суть идеи: Итеративное решение снизу вверх с мемоизацией
Когда использовать: Пересекающиеся подзадачи
Типовые задачи: 0/1 Knapsack, Edit Distance, House Robber

🔸Паттерн: Divide & Conquer
Суть идеи: Рекурсивное деление входных данных
Когда использовать: Сортировка, сложные рекурсии
Типовые задачи: Merge Sort, Count Inversions, Median of Two Sorted Arrays

🔸Паттерн: DFS with Memoization
Суть идеи: Сохраняем уже посчитанные значения, чтобы не вычислять повторно
Когда использовать: DAG, рекурсивное ДП
Типовые задачи: Word Break, Unique Paths III, Longest Increasing Path

🔸Паттерн: Meet in the Middle
Суть идеи: Делим массив пополам, решаем обе части и объединяем
Когда использовать: N ≤ 40, полный перебор слишком дорог
Типовые задачи: Partition to Equal Sum, K-Sum Variants

🔸Паттерн: Trie-Based Search
Суть идеи: Деревья префиксов
Когда использовать: Поиск слов, автодополнение
Типовые задачи: Implement Trie, Replace Words, Word Squares

🔸Паттерн: Segment Tree / BIT
Суть идеи: Эффективные запросы и обновления на диапазонах
Когда использовать: Большие массивы, частые модификации
Типовые задачи: Range sum/min/max, Inversions, Lazy Propagation

🔸Паттерн: Floyd’s Cycle Detection
Суть идеи: Обнаружение цикла с быстрым и медленным указателями
Когда использовать: Связные списки, конечные автоматы
Типовые задачи: Linked List Cycle, Happy Number

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Проект на Spring Boot + Spring AI + OpenAI.

Он принимает текст или файл с заметками встречи и автоматически генерирует JSON-тикеты с классификацией (баг, фича и т.д.).

Теперь в open source: чистый код и готовность к импорту в JIRA.

GitHub: https://github.com/ayushstwt/smart-ticket-ai.git

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot Actuator это мощный набор инструментов в составе Spring Boot, который помогает мониторить и управлять приложением в продакшене. Он предоставляет доступ к различным endpoint'ам, через которые можно получить информацию о внутреннем состоянии приложения - метрики, окружение, дампы потоков и т.д.

Что даёт Actuator:

- статус, метрики, окружение и прочее
- Поддержка мониторинга и управления через HTTP, JMX или кастомные endpoint'ы
- Повышенная наблюдаемость, особенно в связке с Prometheus, Grafana, Micrometer или Spring Boot Admin

Часто используемые endpoint'ы:

🔸/actuator/health
Показывает статус работоспособности приложения
Доступ по умолчанию: Public

🔸/actuator/info
Выводит информацию из application.properties
Доступ по умолчанию: Public

🔸/actuator/metrics
Показывает различные метрики производительности
Доступ по умолчанию: Restricted

🔸/actuator/env
Показывает переменные окружения
Доступ по умолчанию: Restricted

🔸/actuator/beans
Показывает все Spring Beans
Доступ по умолчанию: Restricted

🔸/actuator/threaddump
Дамп потоков приложения
Доступ по умолчанию: Restricted

🔸/actuator/loggers
Просмотр или изменение уровней логирования на лету
Доступ по умолчанию: Restricted

🔸/actuator/heapdump
Скачивание heap dump
Доступ по умолчанию: Restricted

🔸/actuator/prometheus
Метрики в формате Prometheus (если подключён micrometer-registry-prometheus)
Доступ по умолчанию: Public

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Зачем использовать `@ConditionalOnProperty`?

- Включение или отключение бинов и конфигураций на основе значений в `application.properties` без изменения кода
- Загрузка разных бинов для разных сред с помощью конфигурационных параметров
- Исключение лишних бинов снижает потребление памяти и упрощает логику

🔸Включить бин, если свойство существует:
Используется аннотация @ConditionalOnProperty(name="my.prop").
Бин будет создан, если свойство my.prop существует и его значение не "false".

🔸Включить бин, если свойство равно определённому значению:
Добавляется параметр havingValue="yes".
Бин будет создан только в том случае, если значение свойства строго равно "yes".

🔸Включить бин, если свойство отсутствует:
Используется параметр matchIfMissing=true.
Бин будет создан даже в случае, если соответствующее свойство вообще не определено в конфигурации.

🔸Переключение реализаций в зависимости от значения свойства:
Определяются несколько бинов с разными значениями havingValue.
Будет создан только тот бин, значение которого соответствует текущему значению свойства.


👉 Java Portal

Читать полностью…

Java Portal | Программирование

Что такое Fat JAR в Java?

Fat JAR (он же Uber JAR) — это единый исполняемый .jar-файл, который содержит как классы вашего приложения, так и все его зависимости.

Такое приложение полностью самодостаточно — не нужно отдельно подключать внешние библиотеки во время выполнения.

Просто запускается командой:

java -jar myapp-fat.jar


Зачем использовать Fat JAR?

🔹Портируемость — удобно распространять и развёртывать
🔹Простота — не нужно возиться с classpath и отлавливать ClassNotFoundException
🔹Отлично подходит для микросервисов и Docker — один артефакт, одна команда запуска

Как собрать Fat JAR

👉 С помощью Maven (maven-assembly-plugin)

Добавьте в pom.xml:

<!-- пример конфигурации (на 2 фото) -->


Соберите:

mvn clean package


Готовый JAR будет лежать в:

target/myapp-jar-with-dependencies.jar


👉 С помощью Maven (maven-shade-plugin)

Если нужен контроль над пересборкой пакетов и теневыми зависимостями — используйте Shade:

<!-- пример конфигурации на 3 фото -->


Сборка аналогично — итоговый файл будет в:

target/myapp-shaded.jar


👉 С помощью Gradle

В build.gradle добавьте:

// пример конфигурации на 4 фото


Запуск сборки:

./gradlew fatJar


Пример: Минимальное Java-приложение

// 5 фото

С учётом вышеописанных конфигураций Maven или Gradle, все зависимости будут включены в .jar — достаточно java -jar.

Некоторые команды не используют fat JAR для крупных приложений, чтобы:

> Ускорить сборку
> Снизить использование диска
> Упростить обновление отдельных зависимостей без пересборки всего артефакта

Fat JAR упаковывает всё необходимое для простого и портируемого деплоя Java-приложений

Собирается через Maven (плагины assembly или shade) или Gradle
Альтернативы: thin JAR, WAR/EAR, Spring Boot plugin, контейнеры

Выбирайте fat JAR, если важны простота и переносимость, особенно в микросервисной архитектуре и для деплоя в облаке.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Учись алгоритмам программирования с этим ресурсом - код, пошаговое выполнение и наглядное представление.

Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики.

→ http://algorithm-visualizer.org

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Термины, которые действительно должен знать каждый разработчик

• Иммутабельность. Данные, которые нельзя изменить после создания — вместо этого при обновлении создаются новые копии.

• Чистые функции. Функции, которые при одинаковом входе всегда возвращают одинаковый результат и не имеют побочных эффектов.

• Побочные эффекты. Любое внешнее воздействие вне функции (например, логгирование, вызов API, изменение внешнего состояния).

• Референциальная прозрачность. Выражение можно заменить его значением без изменения поведения программы.

• Мутация состояния. Изменение значения переменной или объекта со временем — часто не приветствуется в функциональном программировании.

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

• Декларативное программирование. Описание того, что нужно сделать, а не как это сделать (например, SQL, React, HTML).

• Императивное программирование. Пошаговые инструкции для выполнения задачи (например, циклы, условные операторы).

• Мемоизация. Кеширование результата функции, чтобы при повторных вызовах с теми же аргументами результат возвращался мгновенно.

• Когезия. Насколько чётко и логично связаны обязанности класса — высокая когезия = лучше дизайн.

• Тесная связанность. Классы чрезмерно зависят от внутренней реализации друг друга — изменения становятся рискованными.

• Утиная типизация. «Если выглядит как утка и крякает как утка — значит, это утка» — тип проверяется по поведению, а не по наследованию.

• Срезка объекта. При присваивании объекта производного класса объекту базового типа теряются дополнительные поля/методы — типичная ловушка в C++.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

JMH для микробенчмаркинга производительности:

JMH (Java Microbenchmark Harness) — это инструмент для измерения производительности небольших фрагментов кода, идеально подходит для оптимизации алгоритмов. В этом примере сравнивается простая цикл-реализация и использование Stream API.

→ JMH гарантирует точные и воспроизводимые тесты производительности
→ Используется для оптимизации критичных участков кода в продакшен-приложениях

👉 Java Portal

Читать полностью…

Java Portal | Программирование

HashSet в Java

HashSet — это коллекция для хранения уникальных элементов без гарантии порядка. Относится к пакету java.util и реализует интерфейс Set, внутренне опираясь на HashMap.

Основные особенности Java HashSet:

🔹Дубликаты игнорируются. Если добавить элемент, который уже есть в множестве — ничего не произойдёт.
🔹Элементы не упорядочены ни по добавлению, ни по значению.
🔹Допускается один null-элемент.

Производительность: Базовые операции add, remove, contains выполняются за константное время O(1), при условии качественной хеш-функции.

Даже если дважды добавить строку "BMW" — в сете она появится только один раз.


Часто используемые операции:

— add(E e) — добавляет элемент, если его ещё нет
— remove(Object o) — удаляет элемент, если он есть
— contains(Object o) — проверяет наличие элемента
— size() — возвращает количество элементов
— clear() — очищает сет

Как работает внутри

HashSet использует внутренний HashMap, где элементы сета хранятся как ключи, а значением выступает фиктивный объект. Это позволяет обеспечить уникальность и быстрый доступ.

При выводе содержимого HashSet — элементы отображаются в произвольном порядке.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В чем разница между SLEEP и WAIT в java?

Принадлежность

🔸sleep() — относится к классу Thread
🔸wait() — относится к классу Object

Назначение

🔸sleep() используется для приостановки потока на фиксированное время
🔸wait() используется для взаимодействия между потоками (межпоточная сигнализация)

Блокировка

🔸sleep() не освобождает монитор (lock остаётся удержанным)
🔸wait() освобождает монитор (lock)

Когда использовать

🔸sleep() — когда нужно просто отложить выполнение потока
🔸wait() — когда один поток должен ожидать сигнал от другого потока

Нужен ли synchronized-блок?

🔸sleep() — нет
🔸wait() — да, должен вызываться внутри synchronized-блока или метода

Может быть прерван?

🔸sleep() — да, выбрасывает InterruptedException
🔸wait() — да, выбрасывает InterruptedException

Когда возобновляется

🔸sleep() — после указанного времени
🔸wait() — после вызова notify()/notifyAll() или при прерывании

Статический или экземплярный метод?

🔸sleep() — статический метод, вызывается как Thread.sleep()
🔸wait() — метод экземпляра, вызывается на объекте: obj.wait()

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Креативные (нетрадиционные) способы использования интерфейсов в Java

1) Конфигурация на основе интерфейсов (расширение паттерна Strategy)

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

🔸Инкапсулируется поведение, а не просто значения.
🔸Позволяет менять поведение динамически в рантайме, подставляя разные реализации.

2) Интерфейсы для method chaining с условным выполнением

Интерфейсы могут быть использованы для построения цепочек вызовов методов с возможностью условного выполнения. Это позволяет динамически пропускать определённые вызовы.

Используется при создании fluent API, где некоторые методы должны выполняться только при выполнении условий.
Это:

🔸Делает код более читаемым и выразительным.
🔸Избегает ненужных вызовов, если условие не выполнено.

Традиционный аналог:

if (conditionMet) {
obj.doSomething();
obj.doAnotherThing();
}


3) Маркировочные (tagging/marker) интерфейсы с проверкой по типу

Пустые интерфейсы можно использовать для "тегирования" классов и принятия решений во время выполнения или компиляции.

Это позволяет выполнять определённые действия, если класс реализует конкретный marker-интерфейс.

🔸Чистое разделение ролей без добавления логики
🔸Хорошо сочетается с reflection и generics

4) Наследование интерфейсов для реализации поведения по умолчанию

Интерфейсы с default-методами можно использовать для композиции переиспользуемой логики.

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Советы по Java Stream API: Ленивое вычисление с использованием Supplier<Stream<T>>

Когда возникает необходимость повторно использовать потоковую обработку, можно воспользоваться Supplier. В обычных случаях поток (Stream) нельзя использовать повторно после его обработки.

👉 Java Portal

Читать полностью…
Subscribe to a channel