Java | Вопросы собесов
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام 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).
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
