MiddleJava Developer > Java Core > Multithreading
Короткий ответ Deadlock (взаимная блокировка) — это ситуация, когда два или более потоков навсегда блокируют друг друга: каждый поток удерживает ресурс (монитор, блокировку), который нужен другому, и одновременно ждёт ресурс, удерживаемый другим. В результате программа «зависает», хотя потоки не завершились и не упали с ошибкой. Как это работает подробнее Классический сценарий в Java: поток 1 захватывает монитор объекта A и хочет войти в блок по объекту B, а поток 2 одновременно захватывает B и хочет войти в блок по A. Для возникновения deadlock нужно четыре условия Коффмана: взаимное исключение, удержание и ожидание, отсутствие вытеснения и циклическое ожидание. Достаточно устранить хотя бы одно из них, чтобы взаимной блокировки не было. Похожее явление — livelock: потоки не заблокированы, активно меняют состояние, но из-за взаимных уступок не продвигаются вперёд. Пример кода Что использовать на практике Захватывай блокировки во всех потоках в едином фиксированном порядке (и освобождай в обратном) — это разр
concurrencydeadlock
MiddleJava Developer > Java Core > Java 8+
Короткий ответ Default-метод — это метод интерфейса, у которого есть реализация, помеченная ключевым словом default. Он нужен для обратной совместимости: до Java 8 методы интерфейсов были только абстрактными, и добавление нового метода ломало все классы-реализации. Теперь в существующий интерфейс можно добавить метод с готовой реализацией, и классы продолжат компилироваться без изменений, а при желании переопределят его. Как это работает подробнее Именно благодаря default-методам в Java 8 в старые интерфейсы стандартной библиотеки добавили новые возможности: в Collection появился метод stream(), в List — sort(). Это дало и второе преимущество — множественное «поведенческое» наследование: класс может получить готовую реализацию сразу от нескольких интерфейсов, если между ними нет конфликтов. Важное правило: если класс реализует два интерфейса с одинаковыми default-методами, возникает конфликт, и класс обязан переопределить метод явно, например вызвав SomeInterface.super.method(). Реализация из суперкласса всег
backward-compatibilitydefault-methods
MiddleJava Developer > Java Core > Spring
Короткий ответ DispatcherServlet — фронт-контроллер Spring MVC: он принимает все входящие HTTP-запросы, направляет их к нужным контроллерам, координирует обработку и возвращает ответ клиенту. Архитектурно Spring MVC делит приложение на Model, View и Controller, а DispatcherServlet служит единой точкой входа для всех запросов. Как это работает подробнее Полная цепочка типового запроса в Spring Boot-приложении: клиент → DispatcherServlet → Controller → Service → Repository → база данных, а результат возвращается через контроллер клиенту в виде представления или JSON. В Spring Boot DispatcherServlet настраивается автоматически при подключении spring-boot-starter-web: встроенный Tomcat и авто-конфигурация Spring MVC уже включены. Приём запроса: клиент отправляет HTTP-запрос, и он попадает в DispatcherServlet. Маршрутизация: по маппингам запросов (@RequestMapping, @GetMapping) DispatcherServlet определяет, какой контроллер обработает запрос. Обработка: контроллер взаимодействует с моделью и сервисным слоем и возвр
controllerdispatcherservlet
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Django REST Framework (DRF) — это мощный и гибкий инструментарий поверх Django, который упрощает создание REST API и заметно сокращает объём кода. Он даёт сериализаторы, viewsets, аутентификацию, разрешения и browsable API. Как это работает подробнее DRF строится вокруг нескольких ключевых компонентов, которые вместе покрывают типовые задачи REST-сервисов. Сериализаторы. Serializer и ModelSerializer преобразуют сложные типы данных, такие как queryset и экземпляры моделей, в JSON или XML и обратно. Viewsets. ModelViewSet объединяет набор операций CRUD для модели, а роутеры автоматически генерируют стандартные эндпоинты. Аутентификация. Поддерживаются токены, OAuth и JWT, а также гибкая политика разрешений. Удобство разработки. Browsable API даёт интерактивный веб-интерфейс, доступны пагинация, фильтрация и версионирование. Источники данных. DRF работает как с ORM, так и с не-ORM-источниками данных. Что использовать на практике Стандартный выбор. Используй DRF для построения RESTful-сервисов на D
djangodrf
JuniorPython Developer > Основы Python > Функции и области видимости
Короткий ответ enumerate() — встроенная функция Python, которая при обходе коллекции добавляет каждому элементу индекс и возвращает пары «индекс — элемент». Нумерация по умолчанию начинается с нуля, а вторым аргументом можно задать стартовое значение. Как это работает подробнее Функция возвращает специальный объект-перечисление (enumerate object), который можно использовать прямо в цикле for или преобразовать в список пар через list(). Встроенный счётчик. enumerate() избавляет от отдельной переменной-счётчика и ручного инкремента, поэтому исчезает целый класс ошибок. Пары индекс — элемент. При обходе распаковываются кортежи: первый элемент — номер, второй — значение из коллекции. Стартовое значение. Второй аргумент задаёт начало нумерации: enumerate(months, 1) выведет номера, начиная с единицы. Гибкость. Объект-перечисление годится и для цикла, и для преобразования в список пар с помощью list(). Пример кода Что использовать на практике Цикл с индексом. Когда нужен и номер элемента, и само значение, используй
builtinsenumerate
MiddleJava Developer > Java Core > Дженерики
Короткий ответ Generics — это параметризованные типы: классы, интерфейсы и методы работают с типом, который задаётся при использовании, а не «зашит» в код. Главная решаемая проблема — типобезопасность и раннее обнаружение ошибок: компилятор проверяет типы на этапе компиляции, а не в рантайме, и убирает ручные приведения к Object. Как это работает подробнее До дженериков коллекции хранили Object, и при извлечении требовалось явное приведение, например к строке. Если в список по ошибке попал элемент другого типа, программа падала с ClassCastException в рантайме, часто далеко от места добавления. С дженериками неверный тип не проходит компиляцию — проверки выполняются на этапе компиляции. Механизм работает с классами, интерфейсами и методами: тип-параметр задаётся при использовании (класс с параметром T, дженерик-методы и дженерик-интерфейсы). Параметром может быть только ссылочный тип — примитив нужно оборачивать в класс-обёртку (Integer вместо int). Информация о типе-параметре существует только до компиляции:
collectionscompilation
MiddlePython Developer > Основы Python > Базы данных и SQL
Короткий ответ Агрегатные функции — COUNT, SUM, AVG, MIN, MAX — выполняют вычисления над набором значений и возвращают одно итоговое. GROUP BY группирует записи с одинаковыми данными по одному или нескольким столбцам и применяется вместе с агрегатами. WHERE фильтрует строки до группировки, а HAVING — группы после агрегации. Как это работает подробнее Разница WHERE и HAVING — в этапе фильтрации: обе клаузы могут встретиться в одном запросе, потому что работают на разных стадиях обработки. Этап WHERE. Фильтрует отдельные записи до группировки по конкретным условиям и не может фильтровать агрегированные значения. Этап GROUP BY. Собирает записи с одинаковыми значениями по выбранным столбцам. Этап агрегации. Агрегатная функция, например COUNT(studentId), вычисляет значение для каждой группы. Этап HAVING. Накладывает условие на результат агрегатных функций, например HAVING COUNT(*) > 5. Совместная работа. WHERE исключает ненужные строки до группировки, а HAVING отбрасывает неподходящие группы после неё. Пример кода
aggregate-functionsgroup-by
MiddleJava Developer > Java Core > Collections
При возникновении коллизий HashMap использует метод цепочек. С версии Java 8, если длина списка превышает 8 элементов, он преобразуется в дерево...
CollectionsJava
MiddlePython Developer > Основы Python > Базы данных и SQL
Короткий ответ JOIN — ключевое слово SQL для выборки данных из нескольких таблиц на основе связи между их полями: записи объединяются по связанному столбцу. INNER JOIN возвращает только строки с совпадениями в обеих таблицах. LEFT JOIN — все строки левой таблицы и совпавшие строки правой, RIGHT JOIN — симметрично, а FULL JOIN — все строки обеих таблиц. Как это работает подробнее Типы JOIN отличаются тем, что происходит со строками, у которых нет пары в другой таблице. INNER JOIN. Самый часто используемый тип: если в одной из таблиц нет подходящей строки, запись в результат не попадает. LEFT OUTER JOIN. Возвращает все записи левой таблицы; если пары в правой нет, её поля заполняются NULL. RIGHT OUTER JOIN. Работает симметрично: все строки правой таблицы и только совпавшие строки левой. FULL OUTER JOIN. Возвращает строки при совпадении в любой из таблиц: все строки левой и правой с NULL на месте отсутствующих совпадений. Специальные виды. CROSS JOIN даёт декартово произведение строк, а SELF-JOIN соединяет табли
inner-joinjoin
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ map(), filter() и reduce() — функции для функциональной обработки коллекций. map() применяет функцию к каждому элементу, filter() отбирает элементы по заданному условию, а reduce() последовательно сводит коллекцию к одному итоговому значению. Как это работает подробнее В Python 3 map() и filter() возвращают итераторы, поэтому результат обычно оборачивают в list(), а reduce() вынесена в модуль functools. Преобразование. map(func, iterable) вызывает функцию для каждого элемента и возвращает итератор с результатами; в качестве функции часто передают лямбду. Фильтрация. filter(predicate, iterable) оставляет только те элементы, для которых функция-предикат вернула истину. Свёртка. reduce(func, iterable) из модуля functools последовательно комбинирует элементы — например, суммирует их или находит максимум за один проход. Ленивость. Итераторы, возвращаемые map() и filter(), вычисляются по требованию, что экономит память при обработке больших последовательностей. Пример кода Что использовать на практик
filterfunctional-programming