Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.
— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)
— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем
— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍8🔥4
Практикум, который снимет боль про микросервисы, о которой все молчат.
Sync vs Async: что убьёт ваш проект, а что спасёт?
15 октября, 19:00 — практический вебинар для разработчиков, архитекторов и девопсеров от OTUS. Работаем вместе с Олегом Голенищевым, Senior .NET-разработчиком Directum, преподавателем Microsoft.
Приходи, если хочешь:
✍Понимать, где Sync — мастхэв, а где Async — единственный шанс выжить
✍Получить FANG-уровня чек-лист по интеграции (и бонус — шаблоны конфигов Spring Boot для Kafka и RabbitMQ)
✍Забрать 7% скидку на любой курс OTUS (именно так, просто за регистрацию)
✍Не попасть в “клуб тех, кто строил микросервисы по учебнику, а теперь переписывает всё с нуля”
Запишись, чтобы не чинить то, что можно не ломать.
Запись, подарки и скидка — только для своих. Лови шанс — кликай на регистрацию: https://tglink.io/5e288b078610
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHz1yep
Sync vs Async: что убьёт ваш проект, а что спасёт?
15 октября, 19:00 — практический вебинар для разработчиков, архитекторов и девопсеров от OTUS. Работаем вместе с Олегом Голенищевым, Senior .NET-разработчиком Directum, преподавателем Microsoft.
Приходи, если хочешь:
✍Понимать, где Sync — мастхэв, а где Async — единственный шанс выжить
✍Получить FANG-уровня чек-лист по интеграции (и бонус — шаблоны конфигов Spring Boot для Kafka и RabbitMQ)
✍Забрать 7% скидку на любой курс OTUS (именно так, просто за регистрацию)
✍Не попасть в “клуб тех, кто строил микросервисы по учебнику, а теперь переписывает всё с нуля”
Запишись, чтобы не чинить то, что можно не ломать.
Запись, подарки и скидка — только для своих. Лови шанс — кликай на регистрацию: https://tglink.io/5e288b078610
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHz1yep
❤3👍3🔥2
- Расскажите про сортировку пузырьком и реализуйте её.
Это простой алгоритм сортировки, который использует два вложенных цикла. Внешний цикл отвечает за количество проходов по массиву, а внутренний сравнивает соседние элементы. Если текущий элемент больше следующего, они меняются местами. Так продолжается, пока массив не будет отсортирован.
💡 Ключевые моменты:
▪️ Худший случай: O(n^2)
▪️ Используется строго для небольших наборов данных.
Реализация на картинке
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤4🔥4
15 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥2
Блокирующий метод
Блокирующий метод (blocking method) — это метод, который приостанавливает выполнение текущего потока и ждет определенного события или условия.
Они используются для синхронизации потоков, например при работе с сетью или файлами.
При вызове блокирующего метода поток переходит в состояние ожидания и не выполняет других операций.
Метод блокирует поток до тех пор, пока не произойдет нужное событие, например данные не будут доступны для чтения.
Чтобы избежать блокировки всего приложения, блокирующие вызовы обычно заворачивают в отдельные потоки.
Например, метод readLine() блокирует поток до тех пор, пока пользователь не введет строку и не нажмет Enter.
После ввода данных метод возвращает управление потоку и программа выводит введенную строку.
Таким образом, блокирующий вызов позволяет приостановить выполнение кода до наступления нужного события.
Подписывайся на наш канал в Max🟪
Блокирующий метод (blocking method) — это метод, который приостанавливает выполнение текущего потока и ждет определенного события или условия.
Они используются для синхронизации потоков, например при работе с сетью или файлами.
При вызове блокирующего метода поток переходит в состояние ожидания и не выполняет других операций.
Метод блокирует поток до тех пор, пока не произойдет нужное событие, например данные не будут доступны для чтения.
Чтобы избежать блокировки всего приложения, блокирующие вызовы обычно заворачивают в отдельные потоки.
Например, метод readLine() блокирует поток до тех пор, пока пользователь не введет строку и не нажмет Enter.
После ввода данных метод возвращает управление потоку и программа выводит введенную строку.
Таким образом, блокирующий вызов позволяет приостановить выполнение кода до наступления нужного события.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7🔥4
Твой шанс прокачаться в ИТ, заявить о себе на всю страну и побороться за призовой фонд 10 250 000 рублей 💰 Успей зарегистрироваться до 20 октября.
МТС приглашает на True Tech Champ — всероссийский чемпионат по программированию. Выбирай трек по душе или участвуй сразу в двух, чтобы увеличить шансы на победу.
Трек 1. Алгоритмический. Индивидуальный зачет
Работай со структурами данных, решай алгоритмические задачи и сражайся в лайв-кодинге с сильнейшими.
Трек 2. Программирование роботов. Командный формат
Сначала проведи робота по виртуальному лабиринту, затем управляй им дистанционно на офлайн-полигоне, а в финале — пройди испытания на реальной площадке и выбей соперников с платформы.
🎁 Организаторы отправят командам финалистов по одному роботу Waveshare Cobra Flex для кастомизации. После соревнований они останутся у участников в качестве подарка.
Тебя ждет:
— Зрелищный шоу-финал с искусственным интеллектом, цифровыми аватарами и другими технологиями.
— Конференция с лидерами индустрии, кодерские челленджи и возможность прокачать ИТ-навыки.
— Шанс лично пообщаться с HR-специалистами МТС и получить карьерный буст.
📍Шоу-финал пройдет 21 ноября в МТС Live Холл.
⏰ Успей зарегистрироваться до 20 октября
МТС приглашает на True Tech Champ — всероссийский чемпионат по программированию. Выбирай трек по душе или участвуй сразу в двух, чтобы увеличить шансы на победу.
Трек 1. Алгоритмический. Индивидуальный зачет
Работай со структурами данных, решай алгоритмические задачи и сражайся в лайв-кодинге с сильнейшими.
Трек 2. Программирование роботов. Командный формат
Сначала проведи робота по виртуальному лабиринту, затем управляй им дистанционно на офлайн-полигоне, а в финале — пройди испытания на реальной площадке и выбей соперников с платформы.
🎁 Организаторы отправят командам финалистов по одному роботу Waveshare Cobra Flex для кастомизации. После соревнований они останутся у участников в качестве подарка.
Тебя ждет:
— Зрелищный шоу-финал с искусственным интеллектом, цифровыми аватарами и другими технологиями.
— Конференция с лидерами индустрии, кодерские челленджи и возможность прокачать ИТ-навыки.
— Шанс лично пообщаться с HR-специалистами МТС и получить карьерный буст.
📍Шоу-финал пройдет 21 ноября в МТС Live Холл.
⏰ Успей зарегистрироваться до 20 октября
❤4🔥3👍2
Media is too big
VIEW IN TELEGRAM
In this Java tutorial crash course, I’ll teach you the Java programming language from scratch. Whether you’re a beginner or just curious about how Java works, this video covers everything you need to know to get started fast.
✅ What you’ll learn in this video:
• What is Java and why it’s still one of the most popular programming languages
• How to install and use IntelliJ IDEA for Java development
• Writing your first Java program (System.out.println)
• Working with variables (strings, numbers, booleans)
• Creating and using methods
• Writing if statements and basic logic
• Understanding objects, classes, and records
• Using lists and looping through data
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4😁4❤3
Принципы SOLID
Как разработчики, мы стремимся к тому, чтобы наш код был поддерживаемым, масштабируемым и готовым к изменениям. Один из способов достичь этого — следовать принципам SOLID. Эти пять принципов проектирования помогают создавать системы, которые легко понимать и поддерживать, что ведет к более чистому и надежному коду.
Рассмотрим каждый принцип:
1️⃣ Принцип единственной ответственности (S)
Каждый класс должен иметь только одну причину для изменения, то есть он должен отвечать за одну задачу или ответственность. Это достигается за счет того, что классы фокусируются на выполнении конкретных задач. Соблюдение этого принципа делает код более модульным и простым в поддержке.
2️⃣ Принцип открытости/закрытости (O)
Классы должны быть открыты для расширения, но закрыты для изменения. Это значит, что поведение класса можно расширять, не изменяя его существующий код. В Java это часто реализуется через использование интерфейсов или абстрактных классов.
3️⃣ Принцип подстановки Барбары Лисков (L)
Объекты суперкласса должны заменяться объектами подкласса без нарушения корректности программы. В Java это особенно важно при работе с наследованием, чтобы подклассы правильно расширяли базовые классы, не изменяя их поведение.
4️⃣ Принцип разделения интерфейса (I)
Клиенты не должны зависеть от интерфейсов, которые они не используют. В Java это достигается путем разделения крупных интерфейсов на более узкоспециализированные, чтобы классы реализовывали только те методы, которые им действительно нужны.
5️⃣ Принцип инверсии зависимостей (D)
Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. В Java это часто реализуется через внедрение зависимостей (Dependency Injection), которое позволяет передавать зависимости извне, что способствует слабой связности и гибкости системы.
Подписывайся на наш канал в Max🟪
Как разработчики, мы стремимся к тому, чтобы наш код был поддерживаемым, масштабируемым и готовым к изменениям. Один из способов достичь этого — следовать принципам SOLID. Эти пять принципов проектирования помогают создавать системы, которые легко понимать и поддерживать, что ведет к более чистому и надежному коду.
Рассмотрим каждый принцип:
Каждый класс должен иметь только одну причину для изменения, то есть он должен отвечать за одну задачу или ответственность. Это достигается за счет того, что классы фокусируются на выполнении конкретных задач. Соблюдение этого принципа делает код более модульным и простым в поддержке.
Классы должны быть открыты для расширения, но закрыты для изменения. Это значит, что поведение класса можно расширять, не изменяя его существующий код. В Java это часто реализуется через использование интерфейсов или абстрактных классов.
Объекты суперкласса должны заменяться объектами подкласса без нарушения корректности программы. В Java это особенно важно при работе с наследованием, чтобы подклассы правильно расширяли базовые классы, не изменяя их поведение.
Клиенты не должны зависеть от интерфейсов, которые они не используют. В Java это достигается путем разделения крупных интерфейсов на более узкоспециализированные, чтобы классы реализовывали только те методы, которые им действительно нужны.
Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. В Java это часто реализуется через внедрение зависимостей (Dependency Injection), которое позволяет передавать зависимости извне, что способствует слабой связности и гибкости системы.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥8❤5
🔥16 октября в 20:00 мск — открытый вебинар в OTUS!
О чём?
Хотите объединять данные из разных источников в PostgreSQL без сложных ETL-процессов? Foreign-Data Wrappers (FDW) позволяют превратить PostgreSQL в мощный центр управления данными из внешних баз, облачных хранилищ и систем больших данных.
Что разберём:
- Foreign-Data Wrappers: как они работают в PostgreSQL.
- Интеграция: подключение к внешним базам (MySQL, MongoDB и др.) и управление данными как локальными таблицами.
- Примеры: объединение данных из разных источников без ETL.
- Облачные решения: использование FDW с облачными хранилищами и Big Data.
- Оптимизация: лучшие практики настройки FDW для высокой производительности.
🎓 После вебинара вы:
- Научитесь подключать PostgreSQL к внешним источникам через FDW.
- Освоите настройку и интеграцию данных для гибридных систем..
🔧 Присоединяйтесь, чтобы раскрыть потенциал PostgreSQL и упростить интеграцию данных в ваших проектах!
👉 Зарегистрироваться https://vk.cc/cQnyg6
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
О чём?
Хотите объединять данные из разных источников в PostgreSQL без сложных ETL-процессов? Foreign-Data Wrappers (FDW) позволяют превратить PostgreSQL в мощный центр управления данными из внешних баз, облачных хранилищ и систем больших данных.
Что разберём:
- Foreign-Data Wrappers: как они работают в PostgreSQL.
- Интеграция: подключение к внешним базам (MySQL, MongoDB и др.) и управление данными как локальными таблицами.
- Примеры: объединение данных из разных источников без ETL.
- Облачные решения: использование FDW с облачными хранилищами и Big Data.
- Оптимизация: лучшие практики настройки FDW для высокой производительности.
🎓 После вебинара вы:
- Научитесь подключать PostgreSQL к внешним источникам через FDW.
- Освоите настройку и интеграцию данных для гибридных систем..
🔧 Присоединяйтесь, чтобы раскрыть потенциал PostgreSQL и упростить интеграцию данных в ваших проектах!
👉 Зарегистрироваться https://vk.cc/cQnyg6
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍3❤2🔥2
CompletableFuture
CompletableFuture — это класс в Java, введенный в Java 8, который представляет собой асинхронную задачу, которая будет выполнена в будущем и возвращает результат. CompletableFuture предоставляет множество методов для работы с асинхронными задачами, комбинирования их и управления их выполнением.
Основные возможности CompletableFuture включают:
— Вы можете запустить задачу асинхронно и продолжить выполнение кода без блокировки.
— CompletableFuture позволяет комбинировать результаты нескольких задач, выполняя определенные действия при завершении каждой задачи.
— Вы можете указать обработчики ошибок для обработки исключений, возникающих во время выполнения задачи.
— Вы можете блокировать выполнение кода и ждать завершения задачи.
Подписывайся на наш канал в Max🟪
CompletableFuture — это класс в Java, введенный в Java 8, который представляет собой асинхронную задачу, которая будет выполнена в будущем и возвращает результат. CompletableFuture предоставляет множество методов для работы с асинхронными задачами, комбинирования их и управления их выполнением.
Основные возможности CompletableFuture включают:
— Вы можете запустить задачу асинхронно и продолжить выполнение кода без блокировки.
— CompletableFuture позволяет комбинировать результаты нескольких задач, выполняя определенные действия при завершении каждой задачи.
— Вы можете указать обработчики ошибок для обработки исключений, возникающих во время выполнения задачи.
— Вы можете блокировать выполнение кода и ждать завершения задачи.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥6❤4
Поговорим про деньги в IT?
Приглашаем опытных IT-специалистов пройти небольшой опрос про зарплаты и бенефиты в технологических компаниях. Это займёт не более 7 минут — а ваше мнение поможет одному крупному российскому работодателю делать актуальные оферы.
Пройти опрос можно здесь
Приглашаем опытных IT-специалистов пройти небольшой опрос про зарплаты и бенефиты в технологических компаниях. Это займёт не более 7 минут — а ваше мнение поможет одному крупному российскому работодателю делать актуальные оферы.
Пройти опрос можно здесь
👍4🔥3❤2
В проде редко гоняют приложения напрямую — почти всегда через Docker. А с появлением spring-boot-docker-compose интеграция стала проще: можно поднимать всю инфраструктуру (Postgres, Redis, Kafka и т.д.) одной командой вместе с приложением.
В Spring Boot 3.1 добавили официальный стартер:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
</dependency>
ИЛИ
dependencies {
runtimeOnly("org.springframework.boot:spring-boot-docker-compose")
}
Определим инфраструктуру (например, Postgres + pgAdmin):
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: app-postgres
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@app.local
PGADMIN_DEFAULT_PASSWORD: secret
ports:
- "8081:80"
depends_on:
- postgres
volumes:
postgres_data:
Spring Boot сам подтянет конфигурацию из docker-compose.yml. Просто укажите профиль:
./mvnw spring-boot:run -Dspring.profiles.active=compose
или
./gradlew bootRun --args='--spring.profiles.active=compose'
При старте Boot поднимет контейнеры и подставит spring.datasource.url, username, password.
Если нужны дополнительные параметры — кладём их в src/main/resources/application-compose.yml:
spring:
datasource:
hikari:
maximum-pool-size: 5
— Фиксируйте версии образов, а не latest (для воспроизводимости).
— Healthcheck в docker-compose.yml помогает Boot ждать готовности контейнера.
— Можно запускать docker compose up -d руками, если не хотите, чтобы Boot сам управлял контейнерами.
— Для CI/CD обычно используют отдельные docker-compose.override.yml или Helm чарты, но для дев-окружения spring-boot-docker-compose очень экономит время.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤6👍5
Худи RYBE для Java — это функциональная вещь
Мы добавили несколько фичей, чтобы тебе было классно и комфортно:
⚫️ Карман на металлических кнопках
⚫️ Салфетка для очков или экрана в кармане
⚫️ Люверсы для пропуска
⚫️ Удобный шнурок
⚫️ Надпись на капюшоне и одна особенная внутри него
⚫️ Карман внутри для наушников, чтобы они не болтались и не терялись
Заказать свою толстовку можно на сайте: http://rybe.store/
Наш tg
Реклама ИП Кольцова Римма Алексеевна, ИНН 760212761004, erid: 2Vtzqux1uxZ
Мы добавили несколько фичей, чтобы тебе было классно и комфортно:
Заказать свою толстовку можно на сайте: http://rybe.store/
Наш tg
Реклама ИП Кольцова Римма Алексеевна, ИНН 760212761004, erid: 2Vtzqux1uxZ
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9👍4
Внутреннее устройства HashMap
HashMap — один из базовых и в то же время самых хитро устроенных контейнеров в JDK. На поверхности простая структура «ключ–значение», но под капотом она сочетает массивы, списки и даже деревья, чтобы оставаться быстрой в разных сценариях нагрузки.
📦 Базовая структура
HashMap хранит данные в массиве бакетов
🔑 Хэш и распределение
1. Вызов hashCode() у ключа.
2. Дополнительное хеширование (spread), чтобы снизить коллизии из-за плохой реализации hashCode.
3. Индекс бакета =
🌊 Коллизии
Если несколько ключей попали в один бакет:
— до Java 8 это всегда был связанный список (linked list),
— начиная с Java 8: при росте числа элементов в бакете больше 8 и достаточном размере таблицы он превращается в сбалансированное красно-чёрное дерево. Это резко ускоряет поиск в «плохих» случаях (с O(n) до O(log n)).
⚡️ Ресайзинг
Когда количество элементов превышает
📊 Производительность
— Поиск/вставка/удаление в среднем: O(1).
— В худшем случае (плохой hashCode + коллизии): O(log n) благодаря деревьям.
⚖️ Важные нюансы
— Ключи неупорядочены. Для упорядоченности есть LinkedHashMap.
— HashMap не потокобезопасен. Для многопоточной среды нужен ConcurrentHashMap или синхронизация.
— Хорошо реализованный hashCode и equals критичны, иначе получите «забитые» бакеты и деградацию.
🧮 loadFactor и capacity
— Capacity — размер массива бакетов. По умолчанию 16.
— LoadFactor — коэффициент заполнения. По умолчанию 0.75.
Почему именно 0.75? Это компромисс: выше → меньше памяти, но больше коллизий; ниже → быстрее доступ, но больше памяти уходит впустую. Capacity всегда степень двойки, чтобы можно было вычислять индекс через
🔄 Итераторы и fail-fast
Если во время обхода карта меняется (кроме
🌳 Деревья в деталях
Коллизии превращаются в красно-чёрное дерево, если размер списка в бакете > 8 и общее количество бакетов ≥ 64. Обратно в список (untreeify) при падении количества элементов < 6. Это сделано, чтобы не тратить память и CPU на лишнюю балансировку при малых размерах.
🔗 Документация: OpenJDK — HashMap source
Подписывайся на наш канал в Max🟪
HashMap — один из базовых и в то же время самых хитро устроенных контейнеров в JDK. На поверхности простая структура «ключ–значение», но под капотом она сочетает массивы, списки и даже деревья, чтобы оставаться быстрой в разных сценариях нагрузки.
📦 Базовая структура
HashMap хранит данные в массиве бакетов
(Node<K,V>[] table). Каждый бакет — это «корзина» для элементов, чей hashCode после хеширования и применения & (n-1) (где n — длина массива) указывает на конкретный индекс.🔑 Хэш и распределение
1. Вызов hashCode() у ключа.
2. Дополнительное хеширование (spread), чтобы снизить коллизии из-за плохой реализации hashCode.
3. Индекс бакета =
hash & (table.length - 1).🌊 Коллизии
Если несколько ключей попали в один бакет:
— до Java 8 это всегда был связанный список (linked list),
— начиная с Java 8: при росте числа элементов в бакете больше 8 и достаточном размере таблицы он превращается в сбалансированное красно-чёрное дерево. Это резко ускоряет поиск в «плохих» случаях (с O(n) до O(log n)).
⚡️ Ресайзинг
Когда количество элементов превышает
capacity * loadFactor (по умолчанию 0.75), создаётся новый массив в 2 раза больше, все элементы перехешируются и раскладываются по новым бакетам. Это дорогостоящая операция, но благодаря амортизации остаётся приемлемой.📊 Производительность
— Поиск/вставка/удаление в среднем: O(1).
— В худшем случае (плохой hashCode + коллизии): O(log n) благодаря деревьям.
⚖️ Важные нюансы
— Ключи неупорядочены. Для упорядоченности есть LinkedHashMap.
— HashMap не потокобезопасен. Для многопоточной среды нужен ConcurrentHashMap или синхронизация.
— Хорошо реализованный hashCode и equals критичны, иначе получите «забитые» бакеты и деградацию.
🧮 loadFactor и capacity
— Capacity — размер массива бакетов. По умолчанию 16.
— LoadFactor — коэффициент заполнения. По умолчанию 0.75.
Почему именно 0.75? Это компромисс: выше → меньше памяти, но больше коллизий; ниже → быстрее доступ, но больше памяти уходит впустую. Capacity всегда степень двойки, чтобы можно было вычислять индекс через
hash & (n-1) вместо затратного %.🔄 Итераторы и fail-fast
Если во время обхода карта меняется (кроме
iterator.remove()), бросается ConcurrentModificationException. Под капотом это работает через счётчик модификаций (modCount), который проверяется в каждом next().🌳 Деревья в деталях
Коллизии превращаются в красно-чёрное дерево, если размер списка в бакете > 8 и общее количество бакетов ≥ 64. Обратно в список (untreeify) при падении количества элементов < 6. Это сделано, чтобы не тратить память и CPU на лишнюю балансировку при малых размерах.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤5🔥5
Приглашаем на открытый урок.
🗓 22 октября в 19:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
Уже прошла эпоха монолита, когда целые компании занимались разработкой одного необъятного приложения. Сейчас любая информационная система насыщена различными сервисами, а микросервисами уже никого не удивишь.
Обязательным атрибутом собеседований стал вопрос про Saga, хореографию и оркестрацию.
И именно эту тему мы разберем на вебинаре в применении к Kotlin-разработке.
Что будет на вебинаре:
- Обсудим как традиционные оркестраторы типа Airflow или Camunda, так новых игроков.
- На практической части вебинара мы разработаем простое приложение, управляемое оркестратором.
🔗 Ссылка на регистрацию: https://vk.cc/cQpCBu
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥2
Gradle
Это инструмент автоматизации сборки, который в основном используется в Android-разработке. Популярная альтернатива Ant и Maven.
Gradle позволяет определять и управлять зависимостями проекта, запускать модульные тесты и упаковывать приложение для развертывания. Gradle также имеет систему плагинов, которая позволяет добавлять функциональные возможности и настраивать процесс сборки.
Подписывайся на наш канал в Max🟪
Это инструмент автоматизации сборки, который в основном используется в Android-разработке. Популярная альтернатива Ant и Maven.
Gradle позволяет определять и управлять зависимостями проекта, запускать модульные тесты и упаковывать приложение для развертывания. Gradle также имеет систему плагинов, которая позволяет добавлять функциональные возможности и настраивать процесс сборки.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥3☃1😁1
В многопоточном коде даже простая операция count++ не является атомарной. Она распадается на три шага:
1. Прочитать значение переменной.
2. Увеличить его.
3. Записать обратно.
Если два потока выполнят это одновременно, получится гонка данных (race condition). Итоговое значение будет меньше ожидаемого.
AtomicInteger — это класс из пакета java.util.concurrent.atomic, который предоставляет атомарные (неделимые) операции над целыми числами.
Под капотом он использует механизм CAS (Compare-And-Swap), который поддерживается на уровне процессора.
Принцип работы:
— Читаем текущее значение.
— Проверяем, не изменилось ли оно за это время.
— Если совпадает, записываем новое.
— Если нет, повторяем попытку (spin loop).
public class Counter {
private final AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // атомарное ++
}
public int get() {
return count.get();
}
}
Здесь incrementAndGet() гарантирует, что два потока не «перетрут» друг друга, а каждый инкремент будет учтён.
— Спин-блокировки
CAS может крутиться в цикле, пока не удастся обновить значение. При высокой конкуренции это нагружает процессор.
— ABA-проблема
Значение могло измениться на «A → B → A». Для простых счётчиков это не критично, но в сложных структурах данных используют AtomicStampedReference.
— Ограниченность
AtomicInteger работает только с int. Для более сложных случаев есть AtomicLong, AtomicReference, LongAdder (оптимизирован для высокой конкуренции).
— Для простых счётчиков, метрик.
— В неблокирующих алгоритмах (lock-free).
— В высоконагруженных сценариях, где synchronized слишком дорог.
— Для сложных бизнес-операций над несколькими переменными (лучше использовать мьютексы или транзакции).
— При очень высокой конкуренции, может быть лучше взять LongAdder.
AtomicInteger — это лёгкий способ избавиться от гонок при работе с числами в многопоточности.
Это не магия, а всего лишь тонкая обёртка над CAS, встроенным в процессоры. Понимание этого механизма помогает писать по-настоящему безопасный и быстрый многопоточный код.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤4🔥3