J
Java Ready | Программирование
17.07.2026 11:12 · 👁 421
Почему успешная сборка ещё не означает, что Java-код работает правильно?
В этой статье:
• Почему пустой catch может незаметно скрыть реальную ошибку
• Что произойдёт, если переопределить equals(), но забыть про hashCode()
• Как современные возможности Java помогают убрать старые опасные конструкции
• Зачем подключать SpotBugs, PMD и другие проверки ещё до релиза
Полезный разбор ошибок, которые выглядят безобидно, проходят компиляцию, но позже превращаются в настоящие проблемы.
Продолжай читать на Habr!
👉 Java Ready | #статья
J
Java Ready | Программирование
17.07.2026 09:12 · 👁 474
Пачку офферов заказывали?
О всех трудоустройствах через ИИ-ассистента Софи ребята узнают от пользователей.
И какой же кайф, когда они делятся своими историями.
Вот так в чате узнали сразу о трех новых офферах:
• Кейс Сергея - 2 недели в Софи и 2 оффера.
• Кейс Елены - 1 неделя в Софи и оффер спустя 10 лет перерыва в работе. Елене 52 года.
• Кейс Юлии - 1 месяц в Софи, свитчер из финансового аналитика в разработчика SQL. И еще один оффер🎉
Искренние поздравления ребятам и удачи им на новой работе!
В следующий раз доступ в Софи откроется уже 21 июля.
Если хочешь получить 3 дня бесплатного доступа - подписывайся на этот канал, все анонсы будут там.
J
Java Ready | Программирование
17.07.2026 07:12 · 👁 514
Шпаргалка по регулярным выражениям в Java!
Например, \d находит цифру, \w символ слова, а квантификатор {n,m} задаёт минимальное и максимальное количество повторений.
На картинке классы символов, границы строк, флаги Pattern, жадные и ленивые квантификаторы, группы, обратные ссылки и основные методы Pattern и Matcher.
Сохрани, чтобы не потерять!
👉 Java Ready | #ресурс
J
Java Ready | Программирование
16.07.2026 16:11 · 👁 681
Почему split(".") не разделяет строку по точке?
На первый взгляд такой код выглядит правильно:
String[] parts =
"api.example.com".split(".");
Но split() принимает не обычную строку-разделитель, а регулярное выражение.
В regex точка означает любой символ. Поэтому выражение "." совпадает практически со всей строкой, а пустые элементы в конце результата split() удаляет.
В результате можно неожиданно получить пустой массив:
System.out.println(
Arrays.toString("a.b".split("."))
);
// []
Чтобы искать именно точку, её нужно экранировать:
String[] parts =
"api.example.com".split("\\.");
System.out.println(
Arrays.toString(parts)
);
// [api, example, com]
Два обратных слеша нужны из-за двойной обработки: сначала Java превращает \\ в один слеш, а затем regex получает выражение \.
Если разделитель приходит из переменной, безопаснее не экранировать его вручную:
String separator = ".";
String regex =
Pattern.quote(separator);
String[] parts = text.split(regex);
Pattern.quote() превращает строку в литеральное регулярное выражение. Это особенно полезно для разделителей вроде точки, вертикальной черты, плюса или скобок.
👉 Java Ready | #совет
J
Java Ready | Программирование
16.07.2026 08:12 · 👁 659
Интересная статья о том, как создавались 2D-игры для кнопочных Java-телефонов!
В этой статье:
• Как J2ME и MIDP использовались для разработки мобильных игр
• Как работали спрайты, игровой цикл, ввод и мобильная графика
• Почему разные разрешения, объём памяти и коды кнопок мешали переносимости игр
Продолжай читать на Habr!
👉 Java Ready | #статья
J
Java Ready | Программирование
15.07.2026 11:12 · 👁 707
Собирайте значения по ключу через computeIfAbsent()!
Когда в Map нужно хранить несколько значений для одного ключа, часто появляется ручная проверка:
var values = tags.get(topic);
if (values == null) {
values = new ArrayList<>();
tags.put(topic, values);
}
values.add(tag);
Здесь приходится отдельно получать значение, создавать список и записывать его обратно в Map.
computeIfAbsent() объединяет эти действия:
tags.computeIfAbsent(topic, key -> new ArrayList<>())
.add(tag);
Функция создания вызывается только тогда, когда ключ отсутствует или связан с null. Если список уже существует, Java сразу вернёт его:
tags.computeIfAbsent("java", key -> new ArrayList<>())
.add("collections");
tags.computeIfAbsent("java", key -> new ArrayList<>())
.add("streams");
В результате оба значения окажутся в одном списке:
{java=[collections, streams]}
Тот же приём подходит для группировки объектов, ленивого создания настроек и простых локальных кэшей:
var config = configs.computeIfAbsent(
serviceName,
this::loadConfig
);
Важно: если функция вернёт null, новое соответствие в Map добавлено не будет.
👉 Java Ready | #совет
J
Java Ready | Программирование
15.07.2026 09:12 · 👁 663
1000+ свежих IT-вакансий каждый месяц в одном месте 🤘
Пока другие листают hh — мы ищем вакансии по всему рынку: каналы, сайты компаний, стартапы и закрытые источники.
IT Россия
IT СНГ
Стажировки
Digital
Международка
Удалёнка
Python
Бигтех
Дизайн
QA
Джунам
Frontend
Аналитика
Стартапы за рубежом
DevOps
Не с HH
Автоотклики
J
Java Ready | Программирование
15.07.2026 07:12 · 👁 715
Создаём погодного Telegram-бота на Java!
В этой статье:
• Как подключить OpenWeatherMap и получать актуальную погоду
• Как обновлять прогноз через inline-кнопку без новых сообщений
• Как настроить FSM-диалог, валидацию времени и рассылку по расписанию
Продолжай читать на Habr!
👉 Java Ready | #статья
J
Java Ready | Программирование
14.07.2026 08:12 · 👁 850
😍 Шпаргалки Java-программиста — большая подборка полезных материалов!
На странице собрана коллекция шпаргалок и полезных ресурсов для Java-разработчиков. Здесь есть материалы по Java Core, JPA и Hibernate, Stream API, Lombok, коллекциям, библиотекам для работы с JSON, а также ссылки на обучающие материалы, популярные open-source проекты и подборки для подготовки к собеседованиям.
📌 Оставляю ссылочку: bookflow.ru
👉 Java Ready | #репозиторий
J
Java Ready | Программирование
13.07.2026 17:12 · 👁 850
Генерируем безопасный URL-токен на Java!
Для ссылки подтверждения, сброса пароля или временного приглашения нужен непредсказуемый токен. Обычный Random для этого не подходит, поэтому используем SecureRandom.
Создадим генератор случайных байтов:
private static final SecureRandom RANDOM =
new SecureRandom();
Теперь напишем метод генерации:
static String generateToken(int size) {
byte[] data = new byte[size];
RANDOM.nextBytes(data);
return Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(data);
}
URL Encoder не использует символы, которые могут сломать адрес. Дополнительное кодирование результата не требуется.
Создадим токен из 32 случайных байтов:
String token = generateToken(32);
System.out.println(token);
Пример результата:
Pp1HgxVmySpQJQi3KUUPN5ZXqCV4-ZPvP12Ft49XiI0
Теперь его можно добавить в ссылку:
String link =
"https://ready.com/confirm?token=" + token;
На сервере безопаснее хранить хеш токена:
var digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
token.getBytes(StandardCharsets.UTF_8)
);
Также у токена должен быть срок действия и возможность только одноразового использования.
👉 Java Ready | #практика