JuniorJava Developer > Java Core > Основы Java
Короткий ответ В Java два семейства типов. Примитивные: их ровно восемь — byte, short, int, long, float, double, char, boolean; переменная хранит значение прямо «в себе» и методов у него нет. Ссылочные: классы, интерфейсы, массивы и перечисления; переменная хранит ссылку на объект, который размещается в куче. Как это работает подробнее Главное различие — что именно копируется при присваивании и где хранятся данные. Примитив. При присваивании копируется само значение. Локальные примитивы хранятся в стеке, а примитивные поля — внутри объекта в куче. Ссылочный тип. Переменная хранит адрес области памяти, где лежит объект, созданный оператором new. При присваивании копируется ссылка, и обе переменные указывают на один и тот же объект. Значения по умолчанию. Поле-примитив по умолчанию получает 0 или false, неинициализированная ссылка — null. Когда примитив нужно представить как объект (например, положить в коллекцию), используют классы-обёртки: Integer для int. Пример кода Что использовать на практике Для содержим
javaobject
JuniorJava Developer > Java Core > Collections
Начальная емкость (initial capacity) по умолчанию составляет 16 бакетов, а коэффициент загрузки (load factor) равен 0.75...
BasicsCollections
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Pydantic играет ключевую роль в FastAPI, обеспечивая валидацию данных и управление схемами на основе аннотаций типов Python. Модели Pydantic задают структуру запросов и ответов, а FastAPI использует их для разбора тела запроса, проверки данных и генерации документации. Как это работает подробнее Работа строится вокруг декларативных моделей, которые описывают, как должны выглядеть данные. Разбор запроса. При обращении FastAPI сверяет входящие данные с Pydantic-моделью: при несоответствии типам возвращается понятная ошибка с деталями. Типизированные объекты. Корректные данные превращаются в типизированные Python-объекты, удобные для кода приложения. Документация. На основе моделей автоматически строится интерактивная документация OpenAPI со схемами запросов и ответов. Возможности. Поддерживаются вложенные модели, значения по умолчанию, необязательные поля и кастомные валидаторы. Пример кода Что использовать на практике Декларативные схемы. Описывай запросы и ответы моделями Pydantic с аннотациями
fastapipydantic
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Модуль asyncio даёт инструменты асинхронного программирования: он позволяет выполнять I/O-bound задачи, не блокируя основной поток. Программа регистрирует корутины и продолжает работать, пока идёт ожидание сети, диска или базы данных. Как это работает подробнее В основе asyncio лежит цикл событий, который следит за готовностью корутин и переключает выполнение в точках await. Цикл событий. Управляет корутинами: когда корутина делает await, цикл переключается на другие готовые задачи. Корутины. Создаются ключевым словом async def, а запускаются через await внутри другой корутины либо через asyncio.run(). Ожидание. asyncio.sleep() приостанавливает корутину и возвращает управление циклу, поэтому десятки и сотни таких корутин работают за одно и то же время. Назначение. Асинхронность выгодна приложениям со множеством одновременных соединений: веб-серверам и клиентам внешних API. Пример кода Что использовать на практике Серверы и API. Используй asyncio там, где нужны тысячи одновременных соединений. I
asynciocoroutines
JuniorPython Developer > Основы Python > Модули, пакеты и окружение
Короткий ответ Конструкция if __name__ == '__main__' проверяет, запущен ли файл напрямую как главная программа. При прямом запуске переменная __name__ равна строке '__main__', а при импорте — имени модуля, поэтому блок срабатывает только в первом случае. Как это работает подробнее Конструкция отделяет исполняемую часть модуля от объявлений, которые нужны импортирующему коду. Переменная __name__. Существует в каждом модуле и заполняется интерпретатором автоматически: '__main__' при запуске файла как главной программы и имя модуля при импорте. Разделение ролей. Под проверкой размещают исполняемый код вроде вызова main(), а вне её — функции и классы для импорта. Защита от побочных эффектов. Без проверки код верхнего уровня выполнялся бы и при импорте: печатал сообщения или запускал тяжёлые вычисления. Самопроверка модуля. В такой блок удобно класть собственные тесты, работающие только при прямом запуске файла. Пример кода Что использовать на практике Точка входа. Помещай запуск скрипта, вызов main(), под этот ус
dunder-mainentry-points
MiddleJava Developer > Java Core > ООП
Короткий ответ Статические члены принадлежат классу, а не отдельному экземпляру: static-поле хранится в единственном экземпляре и разделяется всеми объектами класса, а static-метод вызывается через имя класса, без создания объекта. Назначение — общие данные (счётчик созданных объектов, конфигурация) и вспомогательные операции, которым состояние не нужно: Math.max(), Integer.parseInt(). Как это работает подробнее Статическое поле инициализируется один раз при загрузке класса, и из любого объекта через него видно одно и то же значение. Статический метод не привязан к объекту, поэтому внутри него нельзя напрямую обращаться к нестатическим полям и методам экземпляра — у метода просто нет ссылки this. Перегружать статические методы можно, переопределять — нельзя. Статическое поле — общее состояние для всех экземпляров: счётчик созданных объектов, разделяемая конфигурация, кэш. Статический метод — операция без состояния объекта: математические вычисления, парсинг, фабричные и служебные методы. Сокрытие (hiding) — о
class-membersjava
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ FastAPI построен на Starlette и Pydantic: он поддерживает async и await, автоматически генерирует документацию по стандартам OpenAPI и валидирует данные по аннотациям типов. Flask минималистичен и синхронен, поэтому документацию и валидацию приходится писать вручную. Как это работает подробнее Отличия складываются из производительности, поддержки асинхронности и типизации. Производительность. FastAPI поверх Starlette заметно быстрее Flask благодаря асинхронной обработке запросов. Документация. FastAPI автоматически генерирует интерактивную документацию по стандартам OpenAPI и JSON Schema; в Flask её нет. Типизация. Аннотации типов Python дают автодополнение в редакторе, проверку ошибок и более лёгкий рефакторинг. Валидация. Модели Pydantic автоматически проверяют данные запросов и ответов, тогда как во Flask валидацию пишут вручную. Что использовать на практике FastAPI. Выбирай, когда важны производительность, асинхронность, автодокументация и валидация. Flask. Оставляй для простых синхронных п
fastapiflask
JuniorJava Developer > Java Core > Java 8+
Короткий ответ Главная особенность нового Date and Time API (пакет java.time, Java 8) — неизменяемость: все классы, такие как LocalDate, LocalTime, LocalDateTime, immutable, а значит, потокобезопасны. API построен по образцу библиотеки Joda-Time и на основе календарной системы ISO-8601. Он разделяет понятия даты, времени и зоны, предоставляет фабричные методы и fluent-интерфейс для вычислений с датами. Как это работает подробнее API разделяет разные понятия времени: LocalDate — дата без времени и зоны; LocalTime — время без даты и зоны; LocalDateTime — дата и время без зоны; ZonedDateTime и OffsetDateTime — с зоной или смещением; Instant — момент на временной шкале; Duration и Period — промежутки времени. Методы сдвига (plusDays(), minusMonths(), plus(Period)) возвращают новый экземпляр, не меняя исходный, — отсюда неизменяемость и потокобезопасность. Вместо конструкторов с запутанными параметрами используются фабричные методы: now(), of(), parse(). Форматирование и разбор выполняет DateTimeFormatter, который
datetimeimmutable
JuniorPython Developer > Основы Python > Функции и области видимости
Короткий ответ Присваивание внутри функции делает переменную локальной: она видна только в этой функции. Если переменную лишь читают, она считается глобальной, и интерпретатор ищет её на уровне модуля. Чтобы изменить глобальную переменную из функции, нужно ключевое слово global. Как это работает подробнее Правило простое: присваивание в теле функции создаёт локальную переменную, а чтение без присваивания — обращение к переменной из внешней области видимости. Локальная область. Переменные, объявленные внутри функции, существуют только во время её вызова и исчезают после завершения. Глобальная область. Переменные уровня модуля доступны из любого места программы, в том числе из функций при чтении. Одинаковые имена. Присваивание внутри функции создаёт новую локальную переменную с тем же именем, а не меняет глобальную. Ключевое слово global. Оно сообщает интерпретатору, что имя относится к уровню модуля, и тогда переменную можно изменять из функции. Пример кода Что использовать на практике Передача данных. Передав
functionsglobal-variables
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Главное преимущество — эффективное использование процессорного времени: пока один поток заблокирован (ждёт ввода-вывода, сети или базы данных), другие продолжают выполняться, и CPU не простаивает. На многоядерных машинах потоки выполняются по-настоящему параллельно, что ускоряет вычисления, разбиваемые на независимые части. Как это работает подробнее Второй плюс — отзывчивость приложения: в GUI тяжёлая работа выносится в фоновый поток, и интерфейс не «зависает», а серверные приложения обслуживают тысячи клиентов за счёт пулов потоков, а не отдельного процесса на каждый запрос. Потоки экономичнее процессов: они разделяют память процесса и создаются с меньшими накладными расходами. Асинхронные сценарии — задачи, выполняемые в фоне с последующим получением результата, — естественно реализуются через потоки, ExecutorService и Future. Обратная сторона — гонки за данные, взаимные блокировки (deadlock), накладные расходы на переключение контекста и сложность отладки и тестирования многопоточного кода.
concurrencyjava