Найти в Дзене
Разработка учетной системы бронирования авиабилетов - часть 1
Рисунок: разработка учетной системы бронирования авиабилетов 1. Постановка задачи Цель проекта: Разработать веб-систему для учета и бронирования авиабилетов, позволяющую пользователям просматривать доступные рейсы, выбирать места, оформлять бронирования и управлять своими заказами. Система должна быть надежной, масштабируемой и обеспечивать корректную работу с расписанием, наличием мест и финансовыми операциями. Целевая аудитория: Пассажиры (конечные пользователи) Администраторы авиакомпании или...
1 неделю назад
Как устроена Java-машина в Java 11: архитектура, память и эволюция от Java 8
Java 11 — это вторая LTS (Long-Term Support) версия после Java 8, и на сегодняшний день она остаётся одной из самых распространённых в production-средах. Понимание архитектуры JVM в Java 11 критически важно для разработчиков, отвечающих за производительность, стабильность и эффективное использование ресурсов. В этой статье мы: JVM остаётся виртуальной машиной, исполняющей байт-код, но её внутреннее устройство продолжает эволюционировать. Основные компоненты: Class Loader Subsystem Загружает, линкует и инициализирует классы Runtime Data Areas Области памяти (о них — основная часть статьи) Execution...
2 недели назад
Как устроена Java-машина в Java 8: подробно с комментариями и примерами
Java — это не просто язык программирования. За ним стоит мощная виртуальная машина (Java Virtual Machine, JVM), которая делает возможным «write once, run anywhere». В этой статье мы подробно разберём, как устроена JVM в Java 8, с акцентом на архитектуру и управление памятью, приведём реальные примеры и объясним, почему важно понимать эти механизмы при разработке enterprise-приложений. 💡 Зачем это знать? Понимание работы JVM помогает писать более эффективный код, избегать утечек памяти, правильно настраивать производительность и читать логи GC (Garbage Collection). JVM — это виртуальная машина,...
2 недели назад
Разбор 10 задач на Java Stream API
Условие: У вас есть список Product, где каждый товар содержит name, category и price. Необходимо получить Map<String, List<Product>>, где для каждой категории содержится не более 3 самых дорогих товаров, отсортированных по убыванию цены. Пояснение: 💡 Для Java 11:. collect(Collectors.toList()) вместо .toList(). Условие: Получите уникальный набор положительных чисел из вложенного списка. Пояснение: Условие: Дана строка. Нужно найти букву, встречающуюся чаще всего. Если таких несколько — вернуть любую...
1 месяц назад
LeetCode 81: Search in Rotated Sorted Array II Ищем число в повёрнутом отсортированном массиве (с дубликатами!)
Уровень сложности: Средняя (Medium) Теги: Массив, Бинарный поиск, Вращённый массив Дан массив целых чисел nums, отсортированный в неубывающем порядке, но повёрнутый в неизвестной точке. Массив может содержать дубликаты. Проверьте, существует ли заданное целое число target в массиве. Верните true, если target найден, иначе false. 💡 «Повёрнутый» означает: [0,1,2,4,4,4,5,6,6,7] может стать, например, [4,5,6,6,7,0,1,2,4,4]. Пример 1: Ввод: nums = [2,5,6,0,0,1,2], target = 0 Вывод: true Пример 2: Ввод:...
1 месяц назад
LeetCode 80: Remove Duplicates from Sorted Array II
Уровень сложности: Средняя (Medium) Теги: Массив, Два указателя, In-place алгоритм Дан отсортированный массив целых чисел nums в порядке неубывания. Удалите дубликаты на месте так, чтобы каждый уникальный элемент встречался не более двух раз. Относительный порядок элементов должен остаться прежним. Верните новую длину массива после удаления. Важно: вы должны выполнить это на месте, используя только O(1) дополнительной памяти. 💡 Модифицированный массив не обязательно должен быть полностью «очищен» — главное, чтобы первые k элементов (где k — возвращаемое значение) были корректными...
1 месяц назад
LeetCode 79: Word Search — Ищем слово в сетке букв
Уровень сложности: Средняя (Medium) Теги: Массив, Backtracking, Рекурсия, DFS (поиск в глубину) Дана двумерная доска символов board и строка word. Верните true, если word существует на доске. Слово существует, если его можно составить из букв последовательных соседних ячеек, где «соседние» — это горизонтально или вертикально прилегающие клетки. Одну и ту же ячейку нельзя использовать дважды в одном слове. Пример 1: Ввод: board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"...
1 месяц назад
Когда инициализируются static блоки и статические переменные в Java?
Один из часто задаваемых вопросов новичков (и даже опытных разработчиков) — когда именно выполняется инициализация статических полей и static блоков в Java? Интуитивно может показаться, что это происходит сразу при запуске программы или при первом упоминании класса. Но на самом деле всё немного тоньше — и связано с работой ClassLoader'а и инициализацией класса. Важно разделять два этапа: Согласно Java Language Specification (JLS §12.4), инициализация класса запускается в следующих случаях: ⚠️ Обратите...
1 месяц назад
DRY, KISS и YAGNI: три кита чистого и разумного Java-кода
Введение: В повседневной практике Java-разработчика легко утонуть в избыточной архитектуре, дублирующем коде или преждевременной оптимизации. Чтобы избежать этих ловушек, профессионалы опираются на три простых, но мощных принципа: Эти принципы не являются строгими правилами — это философия разумного проектирования. В этой статье мы подробно разберём каждый из них, покажем, как они работают в связке, и объясним, когда не стоит следовать им слепо. DRY призывает избегать дублирования логики. Если одна...
1 месяц назад
Когда и зачем использовать @Qualifier в Spring
В Spring Framework внедрение зависимостей (Dependency Injection, DI) — один из ключевых механизмов, обеспечивающих гибкость и тестируемость приложений. Однако при наличии нескольких бинов одного типа, Spring не может однозначно определить, какой из них следует внедрить. Именно здесь на помощь приходит аннотация @Qualifier. Представим, что у нас есть интерфейс PaymentService и два его реализующих класса: Если в другом компоненте мы попытаемся просто внедрить PaymentService: Spring выбросит исключение...
1 месяц назад
Исключения в Java: Полное руководство с примерами и объяснениями
Исключения — фундаментальная часть языка Java, которая позволяет корректно обрабатывать ошибки и непредвиденные ситуации во время выполнения программы. Понимание того, как работают исключения, помогает писать более надёжный, читаемый и поддерживаемый код. В этой статье мы разберём: Исключение — это событие, которое нарушает нормальный поток выполнения программы. В Java все исключения являются объектами классов, унаследованных от базового класса java.lang.Throwable. Пример простого исключения: Этот код вызовет исключение ArithmeticException, потому что деление на ноль недопустимо...
1 месяц назад
LeetCode 78: Subsets — Генерируем все подмножества
Уровень сложности: Средняя (Medium) Теги: Массив, Рекурсия, Backtracking, Битовые маски Дан уникальный целочисленный массив nums (без дубликатов). Верните все возможные подмножества (называемые также степенью множества). Решение может быть возвращено в любом порядке. 💡 Подмножество — это любая комбинация элементов, включая пустое множество и само множество. Пример 1: Ввод: nums = [1,2,3] Вывод: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] Пример 2: Ввод: nums = [0] Вывод: [[],[0]] Для массива из n уникальных элементов существует ровно 2ⁿ подмножеств...
1 месяц назад