Media is too big
VIEW IN TELEGRAM
Tutorialspoint Java Tutorial - большой справочник по Java!
На сайте собраны разделы по синтаксису, типам данных, операторам, циклам, массивам, ООП, исключениям, коллекциям, потокам, файлам и другим темам, которые часто нужны при изучении и повторении языка.
Оставляю ссылочку на Tutorialspoint
👉 Java Ready | #ресурс
На сайте собраны разделы по синтаксису, типам данных, операторам, циклам, массивам, ООП, исключениям, коллекциям, потокам, файлам и другим темам, которые часто нужны при изучении и повторении языка.
Оставляю ссылочку на Tutorialspoint
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5🔥5
Хорошая статья про JWT-авторизацию на Spring Security!
Автор показывает, как собрать авторизацию через access tokens и связать Spring Security с регистрацией, логином, ролями и проверкой токена в защищённых запросах.
В статье автор показывает:
• как настроить регистрацию и вход пользователя
• как выпускать и проверять JWT-токен
• как подключить фильтр авторизации к SecurityFilterChain
👉 Java Ready | #статья
Автор показывает, как собрать авторизацию через access tokens и связать Spring Security с регистрацией, логином, ролями и проверкой токена в защищённых запросах.
В статье автор показывает:
• как настроить регистрацию и вход пользователя
• как выпускать и проверять JWT-токен
• как подключить фильтр авторизации к SecurityFilterChain
Продолжай читать на Habr
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥4
Собираем простой шаблонизатор строк на Java!
Нужно заменить плейсхолдеры вида {name} и {orderId} значениями из Map. Если значение отсутствует, оставим плейсхолдер как есть, чтобы ошибка была заметна в итоговом тексте.
В этой задаче:
Такой шаблонизатор полезен для писем, логов, уведомлений, CLI-сообщений и генерации простых текстов без подключения тяжёлого template engine.
👉 Java Ready | #задача
Нужно заменить плейсхолдеры вида {name} и {orderId} значениями из Map. Если значение отсутствует, оставим плейсхолдер как есть, чтобы ошибка была заметна в итоговом тексте.
В этой задаче:
• находим плейсхолдеры через Pattern
• достаём имя переменной из группы
• безопасно подставляем значение
Такой шаблонизатор полезен для писем, логов, уведомлений, CLI-сообщений и генерации простых текстов без подключения тяжёлого template engine.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥3
Разбираем CompletableFuture: 7 приёмов для асинхронного Java-кода!
CompletableFuture помогает строить цепочки асинхронных операций без ручного управления Thread. С ним удобно запускать фоновые задачи, преобразовывать результаты, объединять независимые запросы, обрабатывать ошибки и ограничивать время ожидания.
👉 Java Ready | #шпора
CompletableFuture помогает строить цепочки асинхронных операций без ручного управления Thread. С ним удобно запускать фоновые задачи, преобразовывать результаты, объединять независимые запросы, обрабатывать ошибки и ограничивать время ожидания.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3👍3🤝2
Полезный разбор Java-приложений в Kubernetes!
Автор собирает практики, которые помогают запускать JVM-сервисы в контейнерах предсказуемо и без лишних проблем с ресурсами, healthcheck и завершением процесса.
В статье автор показывает:
• как учитывать память контейнера при настройке JVM
• зачем нужны readiness и liveness probes
• почему graceful shutdown важен для сервисов под нагрузкой
👉 Java Ready | #статья
Автор собирает практики, которые помогают запускать JVM-сервисы в контейнерах предсказуемо и без лишних проблем с ресурсами, healthcheck и завершением процесса.
В статье автор показывает:
• как учитывать память контейнера при настройке JVM
• зачем нужны readiness и liveness probes
• почему graceful shutdown важен для сервисов под нагрузкой
Продолжай читать на Habr
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥2
Почему изменяемый ключ в HashMap может сломать поиск?
HashMap ищет значение не просто по содержимому объекта. Сначала он использует hashCode ключа, чтобы выбрать внутреннюю корзину, а потом уже сравнивает ключи через equals.
Представим ключ, где hashCode зависит от поля name:
Если такой объект положить в map, всё выглядит нормально:
Проблема начинается, если после вставки изменить поле, участвующее в equals или hashCode.
Например так:
Теперь объект физически лежит в той корзине, которая была рассчитана для alice. Но при поиске HashMap уже считает хеш для bob и идёт искать в другое место.
Из-за этого даже containsKey может вернуть false:
Это выглядит очень странно, потому что ссылка на объект осталась той же. Но для HashMap важна стабильность equals и hashCode на всё время, пока объект используется как ключ.
Надёжнее делать ключ неизменяемым:
Если нужен обычный класс, поля ключа лучше сделать final и не давать сеттеры. Тогда объект не сможет поменять свой hashCode после добавления в map.
👉 Java Ready | #совет
HashMap ищет значение не просто по содержимому объекта. Сначала он использует hashCode ключа, чтобы выбрать внутреннюю корзину, а потом уже сравнивает ключи через equals.
Представим ключ, где hashCode зависит от поля name:
class UserKey {
String name;
UserKey(String name) {
this.name = name;
}
}Если такой объект положить в map, всё выглядит нормально:
var key = new UserKey("alice");
map.put(key, "admin");Проблема начинается, если после вставки изменить поле, участвующее в equals или hashCode.
Например так:
key.name = "bob";
System.out.println(map.get(key));
Теперь объект физически лежит в той корзине, которая была рассчитана для alice. Но при поиске HashMap уже считает хеш для bob и идёт искать в другое место.
Из-за этого даже containsKey может вернуть false:
System.out.println(map.containsKey(key));
Это выглядит очень странно, потому что ссылка на объект осталась той же. Но для HashMap важна стабильность equals и hashCode на всё время, пока объект используется как ключ.
Надёжнее делать ключ неизменяемым:
record UserKey(String name) {}Если нужен обычный класс, поля ключа лучше сделать final и не давать сеттеры. Тогда объект не сможет поменять свой hashCode после добавления в map.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍3
Шпаргалка по состояниям потока в Java!
Например, NEW означает созданный, но ещё не запущенный поток, RUNNABLE готов к выполнению, WAITING ждёт другого события, а TERMINATED означает завершение работы.
На картинке показан lifecycle потока. Есть переходы между NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING и TERMINATED, а также методы, которые могут переводить поток из одного состояния в другое.
Сохрани, чтобы не потерять!
👉 Java Ready | #ресурс
Например, NEW означает созданный, но ещё не запущенный поток, RUNNABLE готов к выполнению, WAITING ждёт другого события, а TERMINATED означает завершение работы.
На картинке показан lifecycle потока. Есть переходы между NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING и TERMINATED, а также методы, которые могут переводить поток из одного состояния в другое.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤7👍4
Делаем простую очередь задач через BlockingQueue!
Когда один поток создаёт задачи, а другой их обрабатывает, не хочется вручную писать wait, notify и синхронизацию вокруг списка.
Для такого сценария в Java есть BlockingQueue. Она сама умеет ждать элементы и блокировать запись, если очередь ограничена по размеру.
Сначала создадим очередь с лимитом:
Producer может добавлять задачи через put:
Если очередь заполнена, put подождёт свободное место. Это полезно, когда обработчик не успевает за входящим потоком задач.
Consumer забирает элементы через take:
Если очередь пустая, take будет ждать новый элемент. Поэтому не нужен бесконечный цикл с Thread.sleep и ручной проверкой size.
Часто worker запускают в отдельном потоке:
Для остановки можно использовать interrupt или специальную poison pill задачу. Главное, что обмен между потоками остаётся явным и контролируемым.
BlockingQueue хорошо подходит для фоновой обработки писем, логов, webhook-событий, небольших worker-пулов и простых producer-consumer задач.
👉 Java Ready | #практика
Когда один поток создаёт задачи, а другой их обрабатывает, не хочется вручную писать wait, notify и синхронизацию вокруг списка.
Для такого сценария в Java есть BlockingQueue. Она сама умеет ждать элементы и блокировать запись, если очередь ограничена по размеру.
Сначала создадим очередь с лимитом:
BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);
Producer может добавлять задачи через put:
queue.put("send-email");
queue.put("build-report");Если очередь заполнена, put подождёт свободное место. Это полезно, когда обработчик не успевает за входящим потоком задач.
Consumer забирает элементы через take:
String task = queue.take();
System.out.println(task);
Если очередь пустая, take будет ждать новый элемент. Поэтому не нужен бесконечный цикл с Thread.sleep и ручной проверкой size.
Часто worker запускают в отдельном потоке:
while (!Thread.currentThread().isInterrupted()) {
String task = queue.take();
handle(task);
}Для остановки можно использовать interrupt или специальную poison pill задачу. Главное, что обмен между потоками остаётся явным и контролируемым.
BlockingQueue хорошо подходит для фоновой обработки писем, логов, webhook-событий, небольших worker-пулов и простых producer-consumer задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥3
Шпаргалка по JUnit 5!
Например, @Test помечает тестовый метод, @BeforeEach запускает подготовку перед каждым тестом, а assertAll позволяет проверить несколько условий и увидеть все ошибки сразу.
Сохрани, чтобы не потерять!
👉 Java Ready | #ресурс
Например, @Test помечает тестовый метод, @BeforeEach запускает подготовку перед каждым тестом, а assertAll позволяет проверить несколько условий и увидеть все ошибки сразу.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥2
Зачем в Java использовать try-with-resources?
Когда код работает с файлом, соединением или потоком, ресурс нужно закрыть после использования.
Раньше это часто делали через finally:
Если ресурсов несколько, finally быстро разрастается.
В Java для этого есть try-with-resources:
После выхода из блока Java сама вызовет close().
Это работает для любых объектов, которые реализуют AutoCloseable:
Можно открыть несколько ресурсов:
Оба ресурса будут закрыты автоматически, даже если внутри блока возникнет исключение.
Это особенно важно в серверном коде:
Если забывать закрывать такие ресурсы, приложение может постепенно упереться в лимит файлов, соединений или памяти.
👉 Java Ready | #совет
Когда код работает с файлом, соединением или потоком, ресурс нужно закрыть после использования.
Раньше это часто делали через finally:
BufferedReader reader = new BufferedReader(
new FileReader("app.log")
);
try {
System.out.println(reader.readLine());
} finally {
reader.close();
}
Если ресурсов несколько, finally быстро разрастается.
В Java для этого есть try-with-resources:
try (BufferedReader reader = Files.newBufferedReader(path)) {
System.out.println(reader.readLine());
}После выхода из блока Java сама вызовет close().
Это работает для любых объектов, которые реализуют AutoCloseable:
try (Connection connection = dataSource.getConnection()) {
// работа с базой
}Можно открыть несколько ресурсов:
try (
var input = Files.newInputStream(source);
var output = Files.newOutputStream(target)
) {
input.transferTo(output);
}
Оба ресурса будут закрыты автоматически, даже если внутри блока возникнет исключение.
Это особенно важно в серверном коде:
try (var stream = storage.open(fileId)) {
return stream.readAllBytes();
}Если забывать закрывать такие ресурсы, приложение может постепенно упереться в лимит файлов, соединений или памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥3
Media is too big
VIEW IN TELEGRAM
W3Resource Java Exercises - большая база задач по Java!
На сайте собраны тысячи упражнений по Java с решениями и пояснениями. Есть базовый синтаксис, методы, массивы, строки, коллекции, исключения, потоки, ООП, регулярные выражения и алгоритмы.
Разделы удобно проходить как практику. Можно открыть конкретную тему, решить задачу самостоятельно, сравнить с готовым решением и перейти к похожим упражнениям.
Оставляю ссылочку на W3Resource
👉 Java Ready | #ресурс
На сайте собраны тысячи упражнений по Java с решениями и пояснениями. Есть базовый синтаксис, методы, массивы, строки, коллекции, исключения, потоки, ООП, регулярные выражения и алгоритмы.
Разделы удобно проходить как практику. Можно открыть конкретную тему, решить задачу самостоятельно, сравнить с готовым решением и перейти к похожим упражнениям.
Оставляю ссылочку на W3Resource
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥5