Java: fill the gaps
Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк 🔥Тот самый курс по многопочке🔥 https://fillthegaps.ru/mt Комплименты, вопросы, предложения: @utki_letyat
Больше📈 Аналитический обзор Telegram-канала Java: fill the gaps
Канал Java: fill the gaps (@java_fillthegaps) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 12 549 подписчиков, занимая 10 121 место в категории Технологии и приложения и 52 862 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 12 549 подписчиков.
Согласно последним данным от 07 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -46, а за последние 24 часа — 0, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 34.72%. В первые 24 часа после публикации контент обычно набирает N/A% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 0 просмотров. В течение первых суток публикация набирает 0 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 0.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как redis, hashmap, linkedhashmap, индекс, фича.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat”
Благодаря высокой частоте обновлений (последние данные получены 08 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
interface Интерфейс {
public void метод();
}
Классы реализуют эти методы под угрозой ошибки компиляции.
Java 8 — плюс 2 возможности:
▪️Методы по умолчанию с заданной реализацией:
default void метод() {…};
Конкретный класс переопределяет его при необходимости. Дефолтные методы уместны в трёх случаях, об этом будет статья в среду.
▪️ Статические методы с реализацией:
static void метод() {…};
Статические методы не наследуются и не переопределяются. Вызвать такой метод можно только через имя интерфейса:
Интерфейс.метод()Зачем он нужен? В интерфейсе определяется необходимый минимум методов. Например, в Collection это методы add(), remove() и пара других. Чем меньше методов, тем больше свободы действий у конкретных классов. Эти базовые методы комбинируются между собой в другие полезные методы: ▪️Поиск элемента, ▪️Поиск минимального элемента ▪️Скопировать коллекцию Каждый из этих методов — всего лишь комбинация базовых, которая не зависит от конкретного класса. Чтобы не копировать код в каждый класс, удобно вынести его в статический метод в интерфейсе:
static E copy() {…};
До java 8 статические методы часто объединяли в утилитный класс с похожим именем. Например, методы binarySearch, copy, min реализованы в классе Collections.
Java 9 — добавились private и private static методы с реализацией:
private void m() {…};
private static void m() {…};
Эти методы недоступны для классов, реализующих интерфейс.
Зачем они нужны?
Код внутри дефолтных и статических методов может дублироваться. Чтобы улучшить читаемость, можно вынести общие части в приватный метод.
🔸 С методами разобрались, а какие поля можно добавлять в интерфейс?
Только константы с модификаторами public static. Из-за того, что других вариантов нет, в Intellij IDEA public и static подсвечиваются как избыточные и вместо
public static int NUM = 1;допустима запись:
int NUM = 1;Такие поля компилируются в статические! 🔸 Правильный ответ на вопрос перед постом Ошибку компиляции в последней версии java вызовут:
default int get(); private int get(); public static int get();У приватных, статических и default методов в интерфейсах должна быть реализация.
sessionID - { /*info*/ }
Там хранится информация для текущего сеанса.
Когда пользователь вводит логин-пароль, то получает обратно sessionID. SessionID сохраняется в cookies и автоматически добавляется в каждый запрос.
Так сервер понимает, какой пользователь прислал запрос, и с какой информацией работать.
🔸 На клиенте
Если на сервере не хранится ничего временного, то в каждом запросе клиент отправляет все нужные данные.
Браузер отправил логин-пароль — получил обратно имя пользователя и количество накопленных баллов. Сохранил у себя.
Пользователю интересны варианты доставки? В запросе отправляется город, накопленные баллы и другая информация для расчёта.
И тут вопрос — что мешает клиенту передать ложную информацию? Например, что у него 9999999 бонусных баллов.
Тут мы подходим к JWT, он гарантирует корректность присланных ранее данных. Как это работает:
1️⃣ Сервер шлёт какую-то информацию и подписывает её:
"bonus":10 "bonus sign":"Dfhdy76"Подпись, напомню, вычисляется из хэша данных и приватного ключа сервера. 2️⃣ Клиент хранит данные у себя и обратно отправляет вместе с той же подписью:
"city":"moscow" "bonus":10 "bonus sign":"Dfhdy76"3️⃣ Сервер проверяет корректность своим публичным ключом. Если клиент пришлёт "bonus" : 99999, то сервер сразу распознает обман. JWT токен состоит из 3х частей: ▪️ Заголовок с алгоритмом подписи:
{"alg":"HS256", "typ":"JWT"}
▪️ Что-то полезное:
{"bonus":10, "status":"vip"}
▪️ Подпись
По сути это два JSON и строка. Чтобы передавать это как цельный объект, каждая часть кодируется Base64. Части соединяются между собой через точку в одну строку:
eyJh.TYDkwI.SflKxwRJSMИ хотя механизм универсальный, чаще всего он используется для авторизации и помогает серверу понять, кто выполняет запрос: 🔹 Пользователь вводит логин пароль 🔹 Сервер отвечает JWT токеном, внутри которого что-то вроде
"userId":34563847638🔹 Токен каждый раз передаётся в хэдере HTTP запроса 🔹 Сервер валидирует подпись Важные дополнения: JWT ничего не шифрует, только заверяет подлинность данных. Поэтому в JWT токенах не следует передавать пароли или что-то секретное. Важно, чтобы JWT токены хранились и передавались безопасно. Ведь если токен с авторизацией перехватит злоумышленник, то он сможет выдать себя за пользователя. Что делать: использовать HTTPS и самые новые версии браузеров с безопасным хранением cookies. В принципе это всё, что нужно для базового понимания JWT. Больше деталей: ▫️ JWT Security Best Practices ▫️ Спецификация JWT
Objects.hash("пирожок") = 564453454
Результат не зависит от внешних параметров. Объект обратно восстановить нельзя. Самые популярный алгоритм — SHA, иногда используется MD5.
🔸 Кодирование
Цель — преобразовать сообщение для передачи. Используется при ограничениях на формат сообщений.
Пример: нужно передать JSON туда, где ожидается обычный текст.
Кодировка Base64 переводит любой битовый массив в простые символы — цифры, латинские буквы, +, / и =. Уйдут скобки, кавычки и всё, что может смутить канал передачи или библиотеку получателя.
Base64.encode("{"/пирожок"/}") = "TWFuIGlzIGRpc3Rp="
После получения закодированное сообщение приводится к исходному виду:
Base64.decode("TWFuIGlzIGRpc3Rp=") = "{"/пирожок"/}"
🔸 Шифрование
Цель — защитить сообщение от посторонних. Зашифровать и прочитать сообщение могут только обладатели связанных ключей
Хэширование, кодирование и шифрование — это кирпичики, из которых собираются остальные механизмы безопасности.
🔹Например, электронная подпись
Это файлик с расширением .sig, который прилагается к сообщению и доказывает его подлинность.
Само сообщение передаётся в открытом виде и никак не скрывается.
❓ Как это работает?
Подпись может быть на основе любого алгоритма шифрования:
Симметричный алгоритм (редко используется):
▫️ Отправитель вычисляет хэш сообщения и шифрует его ключом
▫️ Получатель выполняет те же действия со своим ключом и сравнивает значение с присланной подписью
▫️ Если сообщение изменилось (поменялся хэш) или использовался не тот ключ, то значения не совпадут. Нет доверия такому документу🙂
Ассиметричный алгоритм:
▪️ Отправитель формирует подпись из хэша сообщения и приватного ключа
▪️ Получатель для проверки вызывает функцию, которая соотносит подпись, хэш сообщения и публичный ключ
Таким образом электронная подпись — это сочетание хэширования и шифрования. В JDK всё это находится в пакете java.security.Пирожок → РйспзплПолучатель выполнит обратную операцию и расшифрует сообщение. Но для стандартных алгоритмов то же самое легко сделает и злоумышленник. Поэтому в преобразования вводится дополнительный параметр и формула становится сложнее. Например:
символ → символ + k
Параметр (или ключ) вносит больше неопределённости в результат. Ключ может быть одним числом или состоять из нескольких чисел. Злоумышленнику нужно гораздо больше времени, чтобы взломать такой шифр.
🔸 Если для расшифровки используется тот же ключ, что и для шифрования, алгоритм называется симметричным.
Наиболее популярен алгоритм AES и его производные. Они, разумеется, более сложные, чем пример выше — сообщения делятся на блоки, блоки перемешиваются, внутри каждого блока выполняются десятки операций, и всё это проходит в несколько раундов.
На практике такой тип шифрования используется редко. Представьте, вы открыли сайт в браузере и хотите залогиниться. Чтобы безопасно передать пароль, вам с сервером нужен общий ключ. Но как получить его — непонятно.
🔸 Поэтому чаще применяется ассиметричное шифрование.
Создаётся пара ключей: один называется публичным, а другой — приватным.
🗝 Публичный ключ свободно распространяется и позволяет шифровать сообщения
🗝 Приватный ключ остаётся у получателя. И только он расшифрует полученное сообщение
Самый популярный ассимметричный алгоритм — RSA. Он основан на простых числах, вычислении степени и остатке от деления. Формулы несложные, а шифр получается вполне стойкий.
В последнее время в тренды выходит EdDSA. Он популярен тем, что активно используется в биткоине. Поддержка этого алгоритма появилась только в java 15.
Вообще алгоритмы шифрования используются не только для шифрования, но и входят в состав остальных инструментов безопасности. Но об этом позже🙂Object
▫️ Рассказать строение HashMap и списков
▫️ Расшифровать SOLID
▫️ Вставить элемент в сбалансированное дерево
Задают везде по сто раз, они мало связаны с ежедневной работой и вообще неинтересные.
С годами отношение поменялось. Представьте, вам нужно нанять человека в команду для несложных (на ваш взгляд) задач. Вы и парочка сеньоров будете направлять его и подстраховывать.
Что ожидается от джуниора и мидла:
▫️ Hard skills: уметь писать на java, знать основные структуры данных, паттерны и фреймворки
▫️ Soft skills: быть приятным в общении, чётко формулировать мысли и возможные проблемы
Хард скиллс более-менее проверяется тестами и конкретными вопросами. Но никто не назовёт себя раздражительным, поэтому софт скиллс проверяются косвенно.
Интервьюер: расскажите устройство HashMap
👦🏽 Кандидат 1: закатывает глаза и вздыхает. Ну там хэши, бакеты, я это уже сто раз рассказывал на другом собесе, давайте дальше
🧔Кандидат 2: чётко и понятно отвечает на вопрос
👨🏻 Кандидат 3: чётко и понятно отвечает на вопрос, упоминает изменения в java 8, готов обсудить ConcurrentHashMap и его эволюцию
Понятно, что Кандидат 2 — отличный парень, Кандидат 3 — вообще лапочка. И по хард скиллам хорошо, и работать с ним будет приятно.
❓ Означают ли стандартные вопросы, что проект скучный?
Мне кажется, корреляция между собеседованием и дальнейшей работой довольно низкая. Бывало, что собеседование долгое и тщательное, а проект так себе. И наоборот — вопросы простейшие, а проект — конфетка. В любом случае нужно спрашивать, что происходит в проекте, какие там технологии, задачи и перспективы.
❓ Что делать, если вопросы на интервью стандартные, но хочется показать себя во всей красе?
Хорошо отвечайте на эти стандартные вопросы. Если на интервью видно ваш крепкий фундамент, значит вы без труда подстроитесь под любой стек и любые специфичные задачи.
Плюс всегда есть момент, чтобы ввернуть ваши интересы или достижения. Как минимум указать в резюме и кратко описать в первой части интервью.
❓ Что проверяют у сеньора, когда задают вопрос про HashMap?
Сеньор не только пишет классный код, но и помогает младшим товарищам. Джуниорам и мидлам придётся часто повторять одно и то же, понятно и доброжелательно. Так что вопрос про хэшмэп вполне подойдёт. Хард скиллы проверяются, конечно, другими вопросами.Enter.
В IDEA достаточно нажать
Shift + EnterИ вы сразу перейдёте на новую строчку Быстро перемещать строки:
Shift + Alt + (стрелка вверх/вниз)Если выделить несколько строк, то группа будет двигаться целиком. Очень простые и приятные фичи🙂
@EqualsAndHashCode. Они создают что-то вроде
public int hashcode() {
return Objects.hash(id, param1, param2);
}
Что не так?
Контракт соблюдается, но суть хэшкода пропадает.
Хэшкод — это быстрая проверка без лишних вычислений. В коде выше результат вычисляется каждый раз на основе множества полей. А по количеству операций Objects.hashcode догоняет equals.
Как считать хэш быстрее:
1️⃣ Использовать одно поле
public int hashcode() {
return id;
}
2️⃣ Сохранять результат в отдельном поле
Подойдёт если у объекта нет id, и основные поля не меняются. Так сделано в классе String:
private int hash;
public int hashCode() {
int h = hash;
if (h==0 && !hashIsZero){
hash = …;
}
return h;
}
Эффект от оптимизации будет заметен, если класс активно участвует в hash-based структурах. В остальных случаях можно оставить автогенерацию.
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
