🤯 🤯 🤯 Параллелизм в многопоточном Java-коде создаёт новые проблемы в тестировании, а баги остаются незамеченными?
⚡️ Приглашаем на открытый вебинар «Юнит тесты для многопоточного кода»
24 июня в 20:00 МСК.
На вебинаре мы разберём:
✔️ Как обнаружить гонки, дедлоки и нестабильность в многопоточном коде.
✔️ Как использовать argumentCaptor и spy для проверки взаимодействия потоков.
✔️ Эмуляцию задержек и таймингов с помощью AdditionalAnswers.
🦾 После урока вы будете уверенно писать стабильные unit-тесты для многопоточного кода, выявлять скрытые баги и улучшать качество тестирования.
Открытый урок проходит в преддверии старта курса «Java Developer. Advanced».
Все участники получат скидку на обучение.
🔗 Регистрируйтесь прямо сейчас: https://vk.cc/cMZNzb
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
24 июня в 20:00 МСК.
На вебинаре мы разберём:
Открытый урок проходит в преддверии старта курса «Java Developer. Advanced».
Все участники получат скидку на обучение.
🔗 Регистрируйтесь прямо сейчас: https://vk.cc/cMZNzb
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Трюк с
Когда ты используешь
📌 Пример:
Если
⚠️ Это особенно критично, если ты триггеришь событие в
💡 Как избежать:
1. Используй явное управление порядком инициализации через
2. Не публикуй события слишком рано — лучше в
🧵 Альтернатива: если тебе нужно гарантированное выполнение в момент старта — лучше использовать
👉@BookJava
@EventListener
в Spring Boot — неочевидная ловушкаКогда ты используешь
@EventListener
для обработки событий в Spring, ты можешь попасть в баг, который очень сложно отловить в бою — пропущенные события.📌 Пример:
@Component
public class MyListener {
@EventListener
public void on(MyEvent event) {
// логика
}
}
Если
MyListener
бин ещё не проинициализирован, а событие уже публикуется (ApplicationEventPublisher#publishEvent
), то метод on
просто не будет вызван. Spring не будет "накапливать" события для будущих слушателей.⚠️ Это особенно критично, если ты триггеришь событие в
@PostConstruct
или в CommandLineRunner
, а слушатель находится в другом бине, который ещё не загружен.💡 Как избежать:
1. Используй явное управление порядком инициализации через
@DependsOn
.2. Не публикуй события слишком рано — лучше в
ApplicationReadyEvent
:
@Component
public class Publisher {
private final ApplicationEventPublisher publisher;
public Publisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
@EventListener(ApplicationReadyEvent.class)
public void onReady() {
publisher.publishEvent(new MyEvent(this));
}
}
🧵 Альтернатива: если тебе нужно гарантированное выполнение в момент старта — лучше использовать
ApplicationRunner
или InitializingBean
, где порядок можно контролировать проще.👉@BookJava
👍6
Совет 💡
Если вы хотите получить сообщение о первопричине, вы можете легко и безопасно получить его с помощью
👉@BookJava
Если вы хотите получить сообщение о первопричине, вы можете легко и безопасно получить его с помощью
Apache Commons ExceptionUtils
. Методы getRootCauseMessage(Exception ex)
выдают сообщение в виде {ClassNameWithoutPackage} {ThrowableMessage}
👉@BookJava
👍7💩1
Когда системы не хотят «дружить» между собой — начинается головная боль.😫
Особенно если речь идет о масштабировании и автоматизации процессов. Как избежать лишнего кода, сэкономить время и силы, при этом интегрировать внешние системы с Apache Kafka?
Ответ — Kafka Connect.
Записывайтесь на открытый вебинар, где мы разберем, как решить типичные проблемы интеграции и масштабирования.
Что будет на вебинаре:
✒️Основы Kafka Connect: Архитектура и принципы работы, коннекторы
✒️Практическая реализация: Настройка и запуск коннекторов для интеграции с базами данных и файловыми системами
✒️Ошибки и их решение: Как эффективно отлаживать и масштабировать Kafka Connect
23 июня в 19:00 (МСК) — Бесплатно!
Спикер: Валентин Шилин — Старший программист и аналитик данных в Deutsche Telekom IT GmbH
Дарим чек-лист по установке Kafka Connect при регистрации на вебинар!
Присоединяйтесь, если хотите научиться упрощать сложные задачи и увеличивать надежность своих систем: https://tglink.io/88d34f764ba1
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFH5vcGg
Особенно если речь идет о масштабировании и автоматизации процессов. Как избежать лишнего кода, сэкономить время и силы, при этом интегрировать внешние системы с Apache Kafka?
Ответ — Kafka Connect.
Записывайтесь на открытый вебинар, где мы разберем, как решить типичные проблемы интеграции и масштабирования.
Что будет на вебинаре:
✒️Основы Kafka Connect: Архитектура и принципы работы, коннекторы
✒️Практическая реализация: Настройка и запуск коннекторов для интеграции с базами данных и файловыми системами
✒️Ошибки и их решение: Как эффективно отлаживать и масштабировать Kafka Connect
23 июня в 19:00 (МСК) — Бесплатно!
Спикер: Валентин Шилин — Старший программист и аналитик данных в Deutsche Telekom IT GmbH
Дарим чек-лист по установке Kafka Connect при регистрации на вебинар!
Присоединяйтесь, если хотите научиться упрощать сложные задачи и увеличивать надежность своих систем: https://tglink.io/88d34f764ba1
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFH5vcGg
👍2
🧠 Spring Boot + MapStruct: как избежать
При обновлении сущностей через MapStruct бывает типичная проблема: маппер затирает уже существующие поля
Допустим, у нас есть:
И сущность:
Если ты используешь обычный
— не переданное поле
📌 Чтобы этого не происходило, добавь в маппер:
💡
⚠️ Это работает только для объектов, не для
Такой подход позволяет обновлять только те поля, которые реально пришли, и не бояться случайного затирания.
👉@BookJava
null
при обновлении сущностиПри обновлении сущностей через MapStruct бывает типичная проблема: маппер затирает уже существующие поля
null'ами
, если они не переданы во входном DTO. Это может легко привести к потере данных. Покажу, как решить это изящно.Допустим, у нас есть:
public class UserDto {
private String name;
private String email;
}
И сущность:
@Entity
public class User {
private String name;
private String email;
}
Если ты используешь обычный
@MappingTarget
, то:
@MappingTarget User user, UserDto dto
— не переданное поле
email
в dto
затирает значение в user
.📌 Чтобы этого не происходило, добавь в маппер:
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface UserMapper {
void update(@MappingTarget User user, UserDto dto);
}
💡
NullValuePropertyMappingStrategy.IGNORE
говорит MapStruct: не трогай те поля, которые в DTO пришли как null
.⚠️ Это работает только для объектов, не для
Optional
и не для примитивов. Там потребуется другая стратегия — например, обёртки или @Condition
.Такой подход позволяет обновлять только те поля, которые реально пришли, и не бояться случайного затирания.
👉@BookJava
👍5❤4
Media is too big
VIEW IN TELEGRAM
Создание REST API с использованием Spring WebFlux и Security
00:00:00 Введение
00:00:20 Создание проекта
00:11:36 Создание миграций БД
00:15:40 Создание базовых классов
00:23:20 Реализация логики генерации JWT токена
00:46:30 Реализация логики валидации JWT токена
00:53:05 Построения цепочки аутентификации
01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
01:12:11 Реализация REST контроллеров
01:23:15 Проверка REST API средствами Postman
01:24:21 Добавление и конфигурация обработчика ошибок
01:25:40 Заключение
Ссылка на Github репозиторий https://github.com/proselytear/webfluxsecurity
источник
👉@BookJava
00:00:00 Введение
00:00:20 Создание проекта
00:11:36 Создание миграций БД
00:15:40 Создание базовых классов
00:23:20 Реализация логики генерации JWT токена
00:46:30 Реализация логики валидации JWT токена
00:53:05 Построения цепочки аутентификации
01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
01:12:11 Реализация REST контроллеров
01:23:15 Проверка REST API средствами Postman
01:24:21 Добавление и конфигурация обработчика ошибок
01:25:40 Заключение
Ссылка на Github репозиторий https://github.com/proselytear/webfluxsecurity
источник
👉@BookJava
👍6🔥1
👩💻🎯 Юнитесты на Java: как новичку поймать баги за 5 Секунд?
Приглашаем на открытый урок.
🗓 25 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».
🦾 Тестирование — суперсила разработчика. Научитесь писать код, который проверяет сам себя, экономит часы на отладке и делает ваши приложения неуязвимыми.
О чём поговорим:
✔️ Что такое Unit-тесты? Для чего они нужны, даже если «код и так работает».
✔️ JUnit 5 для новичков: как установить и написать первый тест.
✔️ Тестирование = Дзен-кодинг: как тесты помогают понять свой код лучше вас самих.
✔️ Ловушки и лайфхаки: что делать, если тесты падают?
Кому будет интересно:
Начинающим Java-разработчикам, студентам и всем, кто хочет перестать бояться слов «тестирование» и «баги».
В результате вебинара вы:
Создадите свой первый тест на Java, поймёте, как тестировать методы с исключениями, и начнёте писать код, которым можно гордиться.
🔗 Ссылка на регистрацию: https://vk.cc/cN4MxX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Приглашаем на открытый урок.
🗓 25 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».
О чём поговорим:
Кому будет интересно:
Начинающим Java-разработчикам, студентам и всем, кто хочет перестать бояться слов «тестирование» и «баги».
В результате вебинара вы:
Создадите свой первый тест на Java, поймёте, как тестировать методы с исключениями, и начнёте писать код, которым можно гордиться.
🔗 Ссылка на регистрацию: https://vk.cc/cN4MxX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Совет Java
✅ Заменяем и переворачиваем последнее слово в строке — без использования StringBuilder!
Когда-нибудь задумывался, как в Java перевернуть только последнее слово в предложении и вставить его обратно? 🤔
Вот лаконичное решение на чистом Java, без использования
💡 Отлично подойдёт новичкам, чтобы лучше понять:
1. Логику реверса строки 🔁
2. Работу с массивами и циклами 🧩
3. Почему важно избегать изменяемых классов, вроде StringBuilder, когда тренируешь основы 💪
👉@BookJava
✅ Заменяем и переворачиваем последнее слово в строке — без использования StringBuilder!
Когда-нибудь задумывался, как в Java перевернуть только последнее слово в предложении и вставить его обратно? 🤔
Вот лаконичное решение на чистом Java, без использования
StringBuilder
.💡 Отлично подойдёт новичкам, чтобы лучше понять:
1. Логику реверса строки 🔁
2. Работу с массивами и циклами 🧩
3. Почему важно избегать изменяемых классов, вроде StringBuilder, когда тренируешь основы 💪
👉@BookJava
👎8👍1💩1
🚀 7 самых полезных методов Stream API в Java 21
Работаешь с коллекциями в Java? Тогда Stream API — твой лучший друг. В Java 21 он стал ещё удобнее. Вот краткая шпаргалка по самым нужным методам — с понятными примерами 👇
🔹 1. filter(Predicate)
📌 Фильтрует элементы по условию.
🧠 Пример: оставить только чётные числа:
🔹 2. map(Function)
📌 Преобразует каждый элемент.
🧠 Пример: сделать все имена заглавными:
🔹 3. flatMap(Function)
📌 «Сплющивает» вложенные коллекции.
🧠 Пример: объединить вложенные списки:
🔹 4. collect(Collector)
📌 Собирает элементы в коллекцию.
🧠 Пример: получить Set из списка:
🔹 5. forEach(Consumer)
📌 Выполняет действие для каждого элемента.
🧠 Пример: распечатать все имена:
🔹 6. reduce(BinaryOperator)
📌 Сводит все элементы к одному значению.
🧠 Пример: сумма чисел:
🔹 7. takeWhile / dropWhile (Java 9+)
📌 Берёт или пропускает элементы, пока выполняется условие.
🧠 Пример: взять только числа < 10:
💡 Лайфхак: вместо
👇 А ты какие методы используешь чаще всего? Поделись в комментах — реальный опыт всегда круче теории!
👉@BookJava
Работаешь с коллекциями в Java? Тогда Stream API — твой лучший друг. В Java 21 он стал ещё удобнее. Вот краткая шпаргалка по самым нужным методам — с понятными примерами 👇
🔹 1. filter(Predicate)
📌 Фильтрует элементы по условию.
🧠 Пример: оставить только чётные числа:
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.toList();
🔹 2. map(Function)
📌 Преобразует каждый элемент.
🧠 Пример: сделать все имена заглавными:
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.toList();
🔹 3. flatMap(Function)
📌 «Сплющивает» вложенные коллекции.
🧠 Пример: объединить вложенные списки:
List<String> words = nestedLists.stream()
.flatMap(List::stream)
.toList();
🔹 4. collect(Collector)
📌 Собирает элементы в коллекцию.
🧠 Пример: получить Set из списка:
Set<String> uniqueNames = names.stream()
.collect(Collectors.toSet());
🔹 5. forEach(Consumer)
📌 Выполняет действие для каждого элемента.
🧠 Пример: распечатать все имена:
names.stream().forEach(System.out::println);
🔹 6. reduce(BinaryOperator)
📌 Сводит все элементы к одному значению.
🧠 Пример: сумма чисел:
int sum = numbers.stream()
.reduce(0, Integer::sum);
🔹 7. takeWhile / dropWhile (Java 9+)
📌 Берёт или пропускает элементы, пока выполняется условие.
🧠 Пример: взять только числа < 10:
List<Integer> lessThanTen = numbers.stream()
.takeWhile(n -> n < 10)
.toList();
💡 Лайфхак: вместо
collect(...)
используй toList()
и toSet()
— код станет чище, а производительность выше.👇 А ты какие методы используешь чаще всего? Поделись в комментах — реальный опыт всегда круче теории!
👉@BookJava
👍3👎3💩3
Как контролировать и управлять приложениями на Spring Boot без лишней головной боли?
На открытом вебинаре «Spring Boot Actuator: основы мониторинга и управления приложением» 25 июня в 20:00 МСК мы разберём:
- Для чего нужен Spring Boot Actuator.
- Как настроить и использовать метрики для контроля приложений.
- Как избежать проблем с производительностью на ранних этапах разработки.
Представьте, что вы с лёгкостью настраиваете мониторинг, отслеживаете метрики и эффективно управляете приложениями без перерывов в работе. Это станет возможным, если освоить Spring Boot Actuator.
Открытый урок проходит в преддверии старта курса «Разработчик на Spring Framework» — все участники получат скидку на обучение.
Регистрируйтесь прямо сейчас: https://vk.cc/cN4MSC
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
На открытом вебинаре «Spring Boot Actuator: основы мониторинга и управления приложением» 25 июня в 20:00 МСК мы разберём:
- Для чего нужен Spring Boot Actuator.
- Как настроить и использовать метрики для контроля приложений.
- Как избежать проблем с производительностью на ранних этапах разработки.
Представьте, что вы с лёгкостью настраиваете мониторинг, отслеживаете метрики и эффективно управляете приложениями без перерывов в работе. Это станет возможным, если освоить Spring Boot Actuator.
Открытый урок проходит в преддверии старта курса «Разработчик на Spring Framework» — все участники получат скидку на обучение.
Регистрируйтесь прямо сейчас: https://vk.cc/cN4MSC
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Проверка на null с помощью Optional
👉@BookJava
Optional
помогает избежать NullPointerExceptions.
String name = "Alice";
Optional<String> maybeName = Optional.ofNullable(name);
System.out.println(maybeName.orElse("Nobody")); // Output: Alice
👉@BookJava
🤡6👍5❤1
🔍 Enumeration vs Iterator в Java
Java-программисты часто сталкиваются с двумя интерфейсами для перебора коллекций: устаревшим
1️⃣ Происхождение
* Enumeration появился в Java 1.0 и используется в старых классах (
* Iterator введён в Java 1.2 вместе с коллекциями из пакета
2️⃣ Методы и возможности
* Enumeration предоставляет методы
* Iterator использует
3️⃣ Fail-fast поведение
* Iterator отслеживает изменения коллекции извне и при обнаружении бросает
* Enumeration такого механизма не имеет — внешние модификации могут приводить к непредсказуемым результатам.
4️⃣ Поддержка дженериков
* Enumeration не типобезопасен (до Java 1.5), что требовало кастов.
* Iterator<E> полностью интегрирован с дженериками, что позволяет избежать
5️⃣ Когда использовать
* Iterator — выбор по умолчанию для всех современных коллекций: гибкость, безопасность и поддержка удаления.
* Enumeration — только при взаимодействии с legacy-API (
💡 Вывод: выбирайте
👉@BookJava
Java-программисты часто сталкиваются с двумя интерфейсами для перебора коллекций: устаревшим
Enumeration
и современным Iterator
. Разберём ключевые отличия:1️⃣ Происхождение
* Enumeration появился в Java 1.0 и используется в старых классах (
Vector
, Hashtable
).* Iterator введён в Java 1.2 вместе с коллекциями из пакета
java.util
(List, Set и т.д.).2️⃣ Методы и возможности
* Enumeration предоставляет методы
hasMoreElements()
для проверки и nextElement()
для получения следующего элемента, но не умеет удалять элементы во время итерации.* Iterator использует
hasNext()
и next()
, а также имеет метод remove()
для безопасного удаления элементов прямо во время обхода.3️⃣ Fail-fast поведение
* Iterator отслеживает изменения коллекции извне и при обнаружении бросает
ConcurrentModificationException
.* Enumeration такого механизма не имеет — внешние модификации могут приводить к непредсказуемым результатам.
4️⃣ Поддержка дженериков
* Enumeration не типобезопасен (до Java 1.5), что требовало кастов.
* Iterator<E> полностью интегрирован с дженериками, что позволяет избежать
ClassCastException
.5️⃣ Когда использовать
* Iterator — выбор по умолчанию для всех современных коллекций: гибкость, безопасность и поддержка удаления.
* Enumeration — только при взаимодействии с legacy-API (
Vector
, Hashtable
и др.).💡 Вывод: выбирайте
Iterator
— он более универсален, безопасен и дружелюбен к дженерикам. Enumeration
сохранён в языке лишь ради обратной совместимости.👉@BookJava
❤6👍1
🧠 Быстрый способ найти performance-проблемы в Spring Boot-приложении
Сейчас покажу, как быстро узнать, какие бины подгружаются дольше всего при старте Spring Boot-приложения.
📌 Добавь в
🔥 Теперь при старте приложения Spring Boot 3+ покажет top-N самых "тяжёлых" бинов:
💡 Это встроенный инструмент, который раньше был только в Spring Boot Actuator!
📈 Отлично помогает:
при оптимизации старта,
для понимания сложностей DI,
при миграции на новые версии.
⚠️ Подходит только для Spring Boot 2.4+ .
👉@BookJava
Сейчас покажу, как быстро узнать, какие бины подгружаются дольше всего при старте Spring Boot-приложения.
📌 Добавь в
application.yml
:
spring:
application:
name: demo
main:
log-startup-info: true
boot:
startup:
logging:
enabled: true
🔥 Теперь при старте приложения Spring Boot 3+ покажет top-N самых "тяжёлых" бинов:
Startup completed in 3.567 seconds
Application started in 3.789 seconds (JVM running for 4.112)
Bean instantiation and initialization:
145 ms -> com.example.HeavyBean
95 ms -> com.example.AnotherBean
💡 Это встроенный инструмент, который раньше был только в Spring Boot Actuator!
📈 Отлично помогает:
при оптимизации старта,
для понимания сложностей DI,
при миграции на новые версии.
⚠️ Подходит только для Spring Boot 2.4+ .
👉@BookJava
👍4❤1
Media is too big
VIEW IN TELEGRAM
Kafka Cluster в Docker
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
❤2👍2
👩💻 Разработка на Java требует глубокого понимания не только языка, но и принципов работы JVM, многопоточности и современных фреймворков.
🎯 Курс «Java Developer. Professional» — это структурированное обучение для разработчиков, которые хотят выйти на новый уровень, освоить актуальный стек технологий и уверенно претендовать на позиции уровня Middle+.
Вы получите 96 часов практической работы, на живых вебинарах разберете ключевые аспекты работы JVM, научитесь строить эффективные многопоточные приложения, освоите Spring WebFlux, Kafka, реактивный Postgres и Kubernetes.
📚Программа OTUS постоянно обновляется, соответствуя требованиям рынка, а диплом ценится работодателями.
➡️ Пройдите вступительное тестирование и присоединяйтесь к группе: https://vk.cc/cN9CYN
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🎯 Курс «Java Developer. Professional» — это структурированное обучение для разработчиков, которые хотят выйти на новый уровень, освоить актуальный стек технологий и уверенно претендовать на позиции уровня Middle+.
Вы получите 96 часов практической работы, на живых вебинарах разберете ключевые аспекты работы JVM, научитесь строить эффективные многопоточные приложения, освоите Spring WebFlux, Kafka, реактивный Postgres и Kubernetes.
📚Программа OTUS постоянно обновляется, соответствуя требованиям рынка, а диплом ценится работодателями.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Java. Представление отрицательных чисел. Преобразование цветной фотографии в черно-белую.
В этом видео я рассказываю о представлении в отрицательных чисел в компьютере на примере типа byte. Показываю, что можно получить, если забыть, что все целочисленные типы в языке программирования Java знаковые. В качестве практической части, пишем алгоритм для преобразования цветной фотографии в черно-белую.
👉@BookJava
В этом видео я рассказываю о представлении в отрицательных чисел в компьютере на примере типа byte. Показываю, что можно получить, если забыть, что все целочисленные типы в языке программирования Java знаковые. В качестве практической части, пишем алгоритм для преобразования цветной фотографии в черно-белую.
👉@BookJava
👍3❤1
📌Примеры базовых алгоритмов
➡️ 1. Сортировка пузырьком (Bubble Sort)
➡️ 2. Бинарный поиск (Binary Search)
➡️ 3. Поиск максимального элемента в массиве
➡️ 4. Факториал через рекурсию
➡️ 5. Проверка, является ли строка палиндромом
👉@BookJava
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// обмен
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
public class BinarySearch {
public static int binarySearch(int[] arr, int target) {
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1; // элемент не найден
}
}
public class MaxInArray {
public static int findMax(int[] arr) {
int max = arr[0];
for (int num : arr) {
if (num > max) max = num;
}
return max;
}
}
public class Factorial {
public static long factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
}
public class PalindromeCheck {
public static boolean isPalindrome(String str) {
int left = 0, right = str.length() - 1;
while (left < right) {
if (str.charAt(left++) != str.charAt(right--)) {
return false;
}
}
return true;
}
}
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
На курсе вы изучите:
Вы сможете протестировать и профилировать приложения под нагрузкой, устранять утечки памяти и оптимизировать их производительность.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как скомпилировать исходники java вручную
В повседневной работе никто из нас не компилирует исходники Java вручную. За нас это делают такие инструменты как maven, gradle или интегрированная среда разработки типа Idea.
Но для понимания процессов, которые происходят при каждом тестовом запуске вашего приложения, имеет смысл хотя бы один попробовать это сделать самостоятельно прямо из консоли.
https://devmark.ru/article/manual-java-compiling
👉@BookJava
В повседневной работе никто из нас не компилирует исходники Java вручную. За нас это делают такие инструменты как maven, gradle или интегрированная среда разработки типа Idea.
Но для понимания процессов, которые происходят при каждом тестовом запуске вашего приложения, имеет смысл хотя бы один попробовать это сделать самостоятельно прямо из консоли.
https://devmark.ru/article/manual-java-compiling
👉@BookJava
👍5
Как обобрать дерево в несколько потоков?
Всем привет, меня зовут Антон, я Java‑разработчик в Сбере, подразделение SberWorks. Я разрабатываю Giga IDE — новую IDE на основе IntelliJ IDEA. В ходе работы столкнулся с тем, что при открытии проектов происходит сканирование всех папок для поиска тех или иных файлов. Если обобщить, то задача сводится к обходу дерева. Я решил подробнее рассмотреть эту тему, причём с прицелом на многопоточность.
Задача обхода деревьев далеко не нова, существуют два основных подхода: обход в ширину и глубину. В первом случае удобно применять рекурсивный алгоритм, а во втором — понадобится дополнительная коллекция, в которую будут складываться узлы дерева, но всё это в один поток, а я решил рассмотреть эту задачу в многопоточной интерпретации.
https://habr.com/ru/companies/sberbank/articles/921528/
👉@BookJava
Всем привет, меня зовут Антон, я Java‑разработчик в Сбере, подразделение SberWorks. Я разрабатываю Giga IDE — новую IDE на основе IntelliJ IDEA. В ходе работы столкнулся с тем, что при открытии проектов происходит сканирование всех папок для поиска тех или иных файлов. Если обобщить, то задача сводится к обходу дерева. Я решил подробнее рассмотреть эту тему, причём с прицелом на многопоточность.
Задача обхода деревьев далеко не нова, существуют два основных подхода: обход в ширину и глубину. В первом случае удобно применять рекурсивный алгоритм, а во втором — понадобится дополнительная коллекция, в которую будут складываться узлы дерева, но всё это в один поток, а я решил рассмотреть эту задачу в многопоточной интерпретации.
https://habr.com/ru/companies/sberbank/articles/921528/
👉@BookJava
👍6🤔1
🔔 Прокачайте системный подход + скидка 🎁 10% на курс до 30 июня
Системный дизайн — для тех, кто отвечает за стратегическое мышление и принятие архитектурных решений
Хотите глубже понимать, как проектируются масштабируемые и устойчивые системы?
Курс «System Design» от OTUS — это:
— Не просто паттерны, а практика проектирования сложных систем,
— Подготовка к архитектурным интервью,
— Реальные кейсы из крупных компаний,
— Финальный проект, который можно показать в портфолио.
Курс подойдёт разработчикам, архитекторам, техническим лидам и DevOps-инженерам, которые хотят повысить квалификацию и системно мыслить при проектировании.
🚀 Успейте воспользоваться 🏷10% скидкой на курс. Выгодные условия действуют до 30 июня включительно!
🔗 Получить скидку и оставить заявку: https://vk.cc/cNfrd0
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Системный дизайн — для тех, кто отвечает за стратегическое мышление и принятие архитектурных решений
Хотите глубже понимать, как проектируются масштабируемые и устойчивые системы?
Курс «System Design» от OTUS — это:
— Не просто паттерны, а практика проектирования сложных систем,
— Подготовка к архитектурным интервью,
— Реальные кейсы из крупных компаний,
— Финальный проект, который можно показать в портфолио.
Курс подойдёт разработчикам, архитекторам, техническим лидам и DevOps-инженерам, которые хотят повысить квалификацию и системно мыслить при проектировании.
🔗 Получить скидку и оставить заявку: https://vk.cc/cNfrd0
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM