Java | Вопросы собесов
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy
Больше📈 Аналитический обзор Telegram-канала Java | Вопросы собесов
Канал Java | Вопросы собесов (@easy_java_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 458 подписчиков, занимая 10 894 место в категории Технологии и приложения и 57 468 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 458 подписчиков.
Согласно последним данным от 10 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 10, а за последние 24 часа — 2, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.71%. В первые 24 часа после публикации контент обычно набирает 7.28% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 227 просмотров. В течение первых суток публикация набирает 834 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 6.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, void, string, строка, static.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+icUwivvbGOkwNWRi
Задачи t.me/+8eqUTboisnkyZjQy
Вакансии t.me/+4pspF5nDjgM4MjQy”
Благодаря высокой частоте обновлений (последние данные получены 11 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
String url = response.encodeURL("http://example.com/resource");
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class URLRewritingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "John Doe");
String url = response.encodeURL("nextPage.jsp");
response.setContentType("text/html");
response.getWriter().println("<a href=\"" + url + "\">Next Page</a>");
}
}
🚩Основные моменты:
🟠Сохранение идентификатора сессии:
Идентификатор сессии передается как параметр URL, например: http://example.com/resource;jsessionid=1234567890.
🟠Безопасность:
URL Rewriting менее безопасен по сравнению с cookies, так как идентификатор сессии виден в URL и может быть легко скопирован.
Плюсы
Работает без cookies: Подходит для браузеров, где cookies отключены или не поддерживаются.
Минусы:
Безопасность: Идентификатор сессии виден в URL, что делает его более уязвимым к кражам.
Удобство использования: Требуется обновление всех ссылок и форм на странице для включения идентификатора сессии.
Ставь 👍 и забирай 📚 Базу знанийЯ уже устал.. долго учу Java, но так и не начал ходить по собесамУзнаешь себя? Наш знакомый эксперт в Java - Павел Сорокин, разобрал самые частые вопросы с которыми к нему обращаются люди на консультациях👇 1️⃣ Постоянно кажется, что я не готов. Процесс обучения длится уже больше 1.5 года, начинаю забывать основы, которые учил в начале. При обучении одна из самых больших ошибок - это распыление фокуса. Определяешь просто частые технологии и вопросы, которые задают на собесах и идешь строго по ним, не распыляясь писал об этом тут. Первые собесы - тренировочные. Можете от них вообще не ожидать никаких результатов, не надеятся - это ТРЕНИРОВКА. Страх будет всегда, его просто нужно принять и идти дальше. Страх возникает из-за неизвестности, неодобрения со стороны других. Даже если вы провалите собес, что самое плохое случится? Вас не убьют, ничего с вами не сделают, вы и также будете сидеть в своем уютном доме. Любой страх уничтожается действием. 2️⃣ Не понимаю насколько глубоко нужно изучать технологию Каждую технологию необходимо понимать ровно настолько, насколько она необходима тебе. Если работаешь с БД и нет каких-то больших нагрузок, то нет смысла углубляться устройство БД. Не нужно знать как Spring устроен под капотом для того, чтобы найти работу. Рациональный подход - просто учить минимальный достаточный набор и улучшать его по пути. 3️⃣ Конкуренция большая, на собеседования невозможно пробиться Конкуренции на самом деле не существует. Если ты обходишь своих конкурентов по резюме/софт-скиллам/хард-скиллам, то для тебя нет конкуренции, когда ты лучше всех. Единственное, что остается - обойти всех. О двух действенных способах пройти на собес рассказал в полной версии поста ‼️ В своем канале Паша дает много информации по вкату и развитию в Java, можно начать ознакомление с его каналом с этого поста с разбором базовых вопросов на собеседованиях. Также у Паши есть отличные бесплатные видео-материалы - полный гайд по Java Core и Многопоточке и реальное успешное собеседование на Junior Java. Можете забрать их в его боте.
HttpServletRequest `getCookies()`: Возвращает массив всех cookies, отправленных с текущим запросом.
Cookie[] cookies = request.getCookies();
🟠Класс HttpServletResponse:`addCookie(Cookie cookie)`: Добавляет указанную cookie в ответ сервлета.
Cookie cookie = new Cookie("name", "value");
response.addCookie(cookie);
🚩Основные методы класса `Cookie`:
🟠Конструктор:
Cookie cookie = new Cookie("name", "value");
🟠`setMaxAge(int expiry)`: Устанавливает время жизни cookie в секундах.
cookie.setMaxAge(60 * 60 * 24); // 1 день
🟠`setPath(String uri)`: Устанавливает путь, для которого cookie действительна.
cookie.setPath("/app");
🟠`setDomain(String domain)`: Устанавливает домен, для которого cookie действительна.
cookie.setDomain(".example.com");
🟠`setSecure(boolean flag)`: Устанавливает флаг secure для HTTPS.
cookie.setSecure(true);
🟠`setHttpOnly(boolean isHttpOnly)`: Устанавливает флаг HttpOnly для защиты от доступа через JavaScript.
cookie.setHttpOnly(true);
🚩Примеры:
🟠Установка cookie:
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(60 * 60 * 24); // 1 день
response.addCookie(cookie);
🟠Получение cookie:
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
String username = cookie.getValue();
}
}
Ставь 👍 и забирай 📚 Базу знанийCookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(60 * 60 * 24); // 1 день
response.addCookie(cookie);
Получение cookie:
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
String username = cookie.getValue();
// Использование cookie
}
}
Ставь 👍 и забирай 📚 Базу знанийHttpSession): Использует объект HttpSession для хранения информации о сессии на стороне сервера.
Создание и получение сессии:
HttpSession session = request.getSession();
Получение существующей сессии или создание новой:
HttpSession session = request.getSession(true);
Получение существующей сессии, если она есть, иначе возвращает null:
HttpSession session = request.getSession(false);
Сохранение данных в сессии:
session.setAttribute("user", "John Doe");
Получение данных из сессии:
String user = (String) session.getAttribute("user");
Удаление данных из сессии:
session.removeAttribute("user");
Завершение сессии:
session.invalidate();
🟠Cookies (Куки): Использует HTTP cookies для сохранения информации на стороне клиента.
Создание куки:
Cookie userCookie = new Cookie("user", "John Doe");
response.addCookie(userCookie);
Получение куки из запроса:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
String user = cookie.getValue();
// Использование куки
}
}
}
🟠URL Rewriting (Переписывание URL): Добавление идентификатора сессии в URL для отслеживания сессии без использования cookies.
Добавление идентификатора сессии в URL:
String url = response.encodeURL("http://example.com/resource");
response.sendRedirect(url);
🟠Hidden Form Fields (Скрытые поля формы): Использование скрытых полей формы для передачи информации о сессии между запросами.
<form action="nextServlet" method="post">
<input type="hidden" name="sessionId" value="12345">
<input type="submit" value="Submit">
</form>
🟠URL Parameters (Параметры URL): Передача информации о сессии через параметры URL.
html
<a href="nextServlet?sessionId=12345">Next Page</a>
java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "John Doe");
String user = (String) session.getAttribute("user");
response.getWriter().println("User: " + user);
}
}
Ставь 👍 и забирай 📚 Базу знаний%XX, где XX — это шестнадцатеричное значение байта.
Когда это необходимо:
🟠При передаче данных в строке запроса URL (например, параметры GET).
🟠При передаче данных в пути URL, чтобы избежать интерпретации специальных символов как частей URL.
Пример:
🟠Пробелы заменяются на %20.
🟠Символы &, ?, = и другие заменяются на %26, %3F, %3D соответственно.
В Java для кодирования URL используется класс URLEncoder и метод encode(). Этот метод принимает строку и кодировку, которую нужно использовать (например, UTF-8), и возвращает закодированную строку.
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class URLEncoderExample {
public static void main(String[] args) {
try {
String originalString = "Hello World! This is a test: & = ?";
String encodedString = URLEncoder.encode(originalString, "UTF-8");
System.out.println("Original: " + originalString);
System.out.println("Encoded: " + encodedString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
Original: Hello World! This is a test: & = ? Encoded: Hello+World%21+This+is+a+test%3A+%26+%3D+%3FДля расшифровки (декодирования) URL в Java используется класс
URLDecoder и метод decode().
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class URLDecoderExample {
public static void main(String[] args) {
try {
String encodedString = "Hello+World%21+This+is+a+test%3A+%26+%3D+%3F";
String decodedString = URLDecoder.decode(encodedString, "UTF-8");
System.out.println("Encoded: " + encodedString);
System.out.println("Decoded: " + decodedString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
Encoded: Hello+World%21+This+is+a+test%3A+%26+%3D+%3F Decoded: Hello World! This is a test: & = ?Ставь 👍 и забирай 📚 Базу знаний
SingleThreadModel был частью Java Servlet API и предназначался для гарантии того, что каждый экземпляр сервлета будет обрабатывать только один запрос за раз. Однако, этот интерфейс устарел начиная с Servlet API версии 2.4 и был официально удален в Servlet API версии 3.0 из-за ряда причин и недостатков.
🚩Основные аспекты `SingleThreadModel`:
🟠Обеспечение потокобезопасности: Интерфейс гарантировал, что один и тот же объект сервлета не будет использоваться несколькими потоками одновременно.
🟠Модель одного потока: При использовании SingleThreadModel, сервер мог создать несколько экземпляров сервлета, чтобы обрабатывать параллельные запросы, либо использовать очереди запросов для одного экземпляра.
Реализация интерфейса:
public class MyServlet extends HttpServlet implements SingleThreadModel {
// Реализация методов сервлета
}
Недостатки:
🟠Производительность: Создание нескольких экземпляров сервлета увеличивало нагрузку на память и ресурсы сервера.
🟠Неэффективность: Модель не решала все проблемы потокобезопасности, так как атрибуты сессии и контекста оставались уязвимыми.
🟠Сложность управления: Сложно было управлять состоянием сервлета и его ресурсами при большом количестве запросов.
Альтернативы и современные подходы:
🟠Синхронизация кода: Использование ключевого слова synchronized и других средств синхронизации для обеспечения потокобезопасности в критических секциях кода.
🟠Пулы потоков: Современные сервлет-контейнеры используют пулы потоков для обработки запросов, что эффективно распределяет нагрузку.
🟠Безопасные структуры данных: Использование потокобезопасных коллекций и других структур данных из пакета java.util.concurrent.
Синхронизации:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SafeServlet extends HttpServlet {
private int counter = 0;
@Override
protected synchronized void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
counter++;
response.getWriter().println("Counter: " + counter);
}
}
Ставь 👍 и забирай 📚 Базу знанийPrintWriter и ServletOutputStream в одном сервлете нельзя. Это связано с тем, что эти два класса работают с разными типами данных и открывают ответный поток в разных режимах — PrintWriter для символьных данных, а ServletOutputStream для байтовых данных.
🤔 Почему нельзя использовать одновременно:
1️⃣ Типы потоков:
➕ `PrintWriter`: Предназначен для записи текстовых данных (символов и строк).
➕ `ServletOutputStream`: Предназначен для записи бинарных данных (байтов и массивов байтов).
2️⃣ Конфликт потоков:
➕ Открытие одного потока блокирует возможность открытия другого. Попытка использования обоих потоков в одном запросе приведет к исключению IllegalStateException.
🤔 Пример неправильного использования:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
public class MixedContentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
ServletOutputStream outputStream = response.getOutputStream(); // Это вызовет IllegalStateException
writer.println("Hello, World!"); // Пытаемся записать текст
byte[] imageData = ...; // Получаем бинарные данные
outputStream.write(imageData); // Пытаемся записать бинарные данные
}
}
🤔 Как правильно использовать:
Если требуется отправить как текстовые, так и бинарные данные, это нужно делать последовательно, разделяя логику на отдельные запросы или сервлеты.
🤔 Пример правильного использования:
1️⃣ Отправка текстовых данных:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class TextServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>Hello, World!</h1></body></html>");
}
}
2️⃣ Отправка бинарных данных:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream;
public class BinaryServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/pdf");
ServletOutputStream out = response.getOutputStream();
byte[] pdfData = ...; // Получаем PDF данные
out.write(pdfData);
}
}
🤔 Итог:
Одновременно использовать PrintWriter и ServletOutputStream в одном сервлете нельзя. Нужно выбирать один из них в зависимости от типа данных, которые требуется отправить в ответе: текстовые данные (использовать PrintWriter) или бинарные данные (использовать ServletOutputStream).
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
