Java: fill the gaps
Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк 🔥Тот самый курс по многопочке🔥 https://fillthegaps.ru/mt Комплименты, вопросы, предложения: @utki_letyat
Ko'proq ko'rsatish📈 Telegram kanali Java: fill the gaps analitikasi
Java: fill the gaps (@java_fillthegaps) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 12 549 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 10 121-o'rinni va Rossiya mintaqasida 52 862-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 12 549 obunachiga ega bo‘ldi.
07 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -46 ga, so‘nggi 24 soatda esa 0 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 34.72% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining N/A% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 0 marta ko‘riladi; birinchi sutkada odatda 0 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 0 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent redis, hashmap, linkedhashmap, индекс, фича kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 08 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
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 структурах. В остальных случаях можно оставить автогенерацию.
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
