Веб-версияОткрыть в Telegram
JJava | Вопросы собесов

Java | Вопросы собесов

@easy_java_ru · канал · Технологии · в индексе с 2026-04-22
11 337подписчиков−4 за неделю
1 098средний охват поста
9.7%ER — охват к подписчикам
61постов за 30 дней
Java | Вопросы собесов
🤔 Что такое as-if-serial semantics? As-If-Serial Semantics – это принцип оптимизации компилятором, при котором код может перестраиваться, но результат его выполнения остаётся таким же, как если бы инструкции выполнялись строго по порядку. Обычный код int a = 10; int b = 20; int c = a + b; System.out.println(c); Что может сделать компилятор? int c = 30; System.out.println(c); 🚩Что можно менять? (Безопасные оптимизации) Менять порядок инструкций, если это не влияет на результат. Удалять лишние переменные и вычисления. Заменять выражения константами (10 + 20 → 30). int x = 5; int y = 10; x = x + 1; // x = 6 System.out.println(y); Компилятор может поменять местами y и x int y = 10; int x = 6; System.out.println(y); 🚩Что нельзя менять? (Гарантированный порядок исполнения) int x = 10; int y = x + 5; x = 20; System.out.println(y); Если поменять порядок x = 20; int y = x + 5; // ❌ Неверно! y теперь 25, а должно быть 15 🚩Как `As-If-Serial` влияет на многопоточность? В многопоточной среде компилятор может менять порядок команд внутри одного потока, но он не знает о другом потоке! Опасный пример без volatile boolean ready = false; int data = 0; void writer() { data = 42; ready = true; } void reader() { if (ready) { System.out.println(data); // Может напечатать 0 из-за перестановки! } } Решение – volatile для ready volatile boolean ready = false; Ставь 👍 и забирай 📚 Базу знаний
6 · 1.3K ·
J
🤔 В каких случаях бы применял Java-конфигурацию? Java-конфигурация уместна: - при написании тестов; - когда проект хочет избежать XML; - для динамической регистрации бинов; - при условной конфигурации через @Conditional, профили и параметры окружения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
4 · 1.2K ·
Java | Вопросы собесов
🤔 Является ли коллекция HashMap потоком безопасной? Коллекция HashMap не является потокобезопасной. Это означает, что при одновременном доступе к нему из нескольких потоков без должной синхронизации могут возникнуть проблемы, такие как потеря данных, гонки за данные и другие виды состояний гонки. Если один поток изменяет ее структуру (например, добавляя или удаляя элементы), в то время как другой поток итерирует по ней или также пытается внести изменения, результаты могут быть непредсказуемыми. 🟠Collections.synchronizedMap(Map) Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций. Map<String, String> map = Collections.synchronizedMap(new HashMap<>()); 🟠ConcurrentHashMap Предоставляет потокобезопасную реализацию карты без блокировки всей карты. ConcurrentHashMap разработан для высокой конкуренции и эффективности при доступе из множества потоков, обеспечивая лучшую производительность по сравнению с synchronizedMap. ConcurrentHashMap позволяет одновременно читать данные из карты несколькими потоками без блокировки и записывать данные при минимальной блокировке. Map<String, String> concurrentMap = new ConcurrentHashMap<>(); Ставь 👍 и забирай 📚 Базу знаний
4 · 1.3K ·
J
🤔 Что такое Spring Data Repository? Это интерфейс, предоставляемый Spring Data, который автоматически генерирует реализацию репозитория для работы с БД. Наследуется от JpaRepository, CrudRepository, и предоставляет методы save, findById, delete, findAll и возможность добавлять свои запросы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
4 · 1.2K ·
Java | Вопросы собесов
🤔 Расскажи про способы оптимизации запросов в БД Оптимизация запросов в базе данных (БД) — это процесс улучшения их производительности, чтобы они выполнялись быстрее и использовали меньше ресурсов. Рассмотрим основные способы оптимизации SQL-запросов. 🟠Индексы Индексы ускоряют поиск данных, создавая структуру, похожую на оглавление книги. Вместо полного перебора таблицы (Full Table Scan), БД быстро находит нужные строки по индексу. CREATE INDEX idx_user_name ON users(name); 🟠Оптимизация `SELECT` Избегайте SELECT *, так как это нагружает систему избыточными данными. Плохо SELECT * FROM users; Хорошо SELECT id, name FROM users; 🟠Использование `EXPLAIN` Перед оптимизацией полезно посмотреть, как БД выполняет запрос. EXPLAIN SELECT * FROM users WHERE name = 'Ivan'; 🟠Ограничение выборки (`LIMIT`, `OFFSET`) Если вам нужно получить только первые N строк, используйте LIMIT, чтобы БД не грузила лишние данные. SELECT * FROM users ORDER BY id LIMIT 10; 🟠Оптимизация `JOIN` Соединение (JOIN) таблиц может быть дорогостоящим. Вот несколько рекомендаций: - Используйте индексы на полях, участвующих в JOIN. - Если возможно, замените сложные JOIN на подзапросы (EXISTS, IN). CREATE INDEX idx_orders_user_id ON orders(user_id); 🟠Кеширование запросов Часто повторяющиеся запросы можно кэшировать на уровне БД (QUERY CACHE в MySQL) или в приложении (Redis, Memcached). SET GLOBAL query_cache_size = 1000000; 🟠Нормализация и денормализация Нормализация уменьшает дублирование данных, разбивая таблицы. Денормализация может ускорить работу, дублируя данные и уменьшая количество JOIN. Ставь 👍 и забирай 📚 Базу знаний
9 · 1.2K ·
J
🤔 Какие конструкции в обработке ошибок известны? - try-catch: Перехват и обработка исключений. - finally: Код, который выполняется независимо от того, возникло исключение или нет. - throw: Выбрасывание исключений. - throws: Объявление исключений в сигнатуре метода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
3 · 1K ·
Java | Вопросы собесов
🤔 Какие минусы Rest в высоконагруженных сис-мах? REST – это удобный и популярный архитектурный стиль, но в высоконагруженных системах у него есть недостатки. 🚩Высокие накладные расходы HTTP (избыточность) Проблема: Каждый REST-запрос передаёт много мета-информации (заголовки, cookies, CORS, JSON/XML). GET /users/123 HTTP/1.1 Host: api.example.com Authorization: Bearer token123 Content-Type: application/json В WebSocket/gRPC запрос выглядел бы так { "userId": 123 } 🚩REST-запросы неэффективны для чатов и real-time Проблема: REST использует "запрос-ответ", но **не поддерживает real-time. Что происходит в REST? 1. Клиент делает HTTP-запрос к серверу. 2. Сервер обрабатывает и отправляет ответ. 3. Если клиенту нужно новое сообщение, он снова делает запрос (Polling) или использует Long Polling. 🚩Проблемы с кэшированием Проблема: Не все REST-запросы можно кэшировать. Кэшируются только GET-запросы (если сервер поддерживает ETag и Cache-Control). POST, PUT, DELETE – не кэшируются, потому что меняют данные. 🚩REST API неэффективен для сложных запросов Проблема: REST требует много отдельных запросов, если нужно загрузить связанные данные. Пример проблемы REST: Получить пользователя: /users/123 Получить заказы этого пользователя: /users/123/orders Получить детали заказов: /orders/456/details Ставь 👍 и забирай 📚 Базу знаний
7 · 1.1K ·
J
🤔 В чём разница между String и StringBuilder? - String: - Неизменяемая (immutable). - Каждое изменение создаёт новую строку. - Удобно для чтения, но неэффективно при множественных изменениях. - StringBuilder: - Изменяемая (mutable). - Эффективен при конкатенации или сборке строк в цикле. - Не потокобезопасен, но работает быстрее. Если нужно собрать строку в цикле — выбирай StringBuilder, а не +. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
4 · 1.1K ·
Java | Вопросы собесов
🤔 Какая сложность поиска метода по ключу в коллекции TreMap? В TreeMap поиск элемента по ключу выполняется за O(log n). 🚩Почему сложность `O(log n)`? TreeMap основан на красно-чёрном дереве (Red-Black Tree). Красно-чёрное дерево – это самобалансирующееся бинарное дерево. В худшем случае, глубина дерева ≈ log₂(n), поэтому: Поиск (get(key)) выполняется за O(log n). Вставка (put(key, value)) тоже O(log n), так как требует балансировки. import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { TreeMap<Integer, String> treeMap = new TreeMap<>(); treeMap.put(10, "Ten"); treeMap.put(20, "Twenty"); treeMap.put(30, "Thirty"); System.out.println(treeMap.get(20)); // Поиск за O(log n) } } Ставь 👍 и забирай 📚 Базу знаний
6 · 1.1K ·
J
🤔 Какие есть методы HTTP-запросов? - GET — получение данных; - POST — создание ресурса; - PUT — полное обновление ресурса; - PATCH — частичное обновление; - DELETE — удаление; - HEAD, OPTIONS, TRACE — вспомогательные методы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
4 · 1K ·
Java | Вопросы собесов
🤔 Как бороться в БД с SQL Injection? SQL Injection – это атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, чтобы получить несанкционированный доступ к данным. Допустим, у нас есть код String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; Если злоумышленник введёт ' OR '1'='1 в поле пароля, запрос превратится в: SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1' 🚩Способы защиты от SQL Injection 🟠Использование `PreparedStatement` (РЕКОМЕНДУЕТСЯ) Подготовленные запросы автоматически экранируют входные данные, предотвращая SQL-инъекции. String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); 🟠Использование ORM (например, Hibernate) ORM-фреймворки (Hibernate, JPA) автоматически генерируют безопасные SQL-запросы. TypedQuery<User> query = entityManager.createQuery( "SELECT u FROM User u WHERE u.username = :username AND u.password = :password", User.class); query.setParameter("username", username); query.setParameter("password", password); User user = query.getSingleResult(); 🟠Проверка и экранирование входных данных Если по какой-то причине PreparedStatement использовать нельзя, экранируйте опасные символы (', " и ;). String safeInput = input.replace("'", "\\'"); 🟠Минимизация прав в БД Создавайте отдельного пользователя БД с ограниченными правами: Запрет на DROP, DELETE, UPDATE без WHERE Только доступ к нужным таблицам CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'securepassword'; GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'app_user'@'localhost'; 🟠Использование Web Application Firewall (WAF) WAF анализирует HTTP-запросы и блокирует подозрительные SQL-запросы. Пример: ModSecurity – популярный WAF для защиты веб-приложений. Ставь 👍 и забирай 📚 Базу знаний
6 · 966 ·
J
🤔 Как подключить свою библиотеку в другом проекте? Для подключения своей библиотеки: - собрать её в JAR; - опубликовать в локальный или удалённый репозиторий (например, Maven Central, Nexus, Artifactory); - добавить зависимость в pom.xml или build.gradle другого проекта. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
3 · 929 ·
Java | Вопросы собесов
🤔 Что такое синхронизация и зачем она нужна? Синхронизация — это механизм, который используется для контроля доступа к общим ресурсам или критическим секциям кода в среде, где несколько потоков или процессов могут одновременно выполняться. Основная цель — обеспечить корректное взаимодействие между потоками, предотвращая одновременное выполнение определённых участков кода, которые могут привести к конфликтам или неконсистентному состоянию данных. 🚩Зачем она нужна 🟠Предотвращение гонки данных (race conditions) Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность. 🟠Обеспечение видимости изменений В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам. 🟠Последовательный доступ к ресурсам Некоторые операции или ресурсы требуют последовательного доступа для предотвращения конфликтов или некорректной работы. Например, запись в файл или обновление базы данных должны выполняться последовательно, чтобы избежать наложения данных или повреждения структуры данных. 🚩Как она реализуется 🟠Ключевое слово synchronized Может использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно. 🟠Явные блокировки с использованием классов из пакета java.util.concurrent.locks Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа. 🟠Волатильные переменные (volatile) Обеспечивают видимость изменений переменных
3 · 891 ·
J
🤔 Что такое временная сложность? Временная сложность — это оценка времени выполнения алгоритма в зависимости от размера входных данных. Измеряется через нотацию O(...) и помогает сравнивать эффективность алгоритмов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
5 · 814 ·
Java | Вопросы собесов
🤔 Что такое Appender в log4j? Это компонент, который отвечает за отправку логов в различные места назначения, такие как файлы, консоль, базы данных, сетевые сокеты или даже удаленные серверы. Каждый Appender реализует конкретный способ обработки и хранения логов. 🚩Зачем нужен Appender? Appender позволяет гибко управлять тем, куда и как сохраняются логи. В зависимости от требований приложения, вы можете: Писать логи в файл. Выводить их в консоль. Отправлять их в удалённые хранилища или базы данных. 🚩Основные виды Appender в Log4j 🟠ConsoleAppender Логи выводятся в консоль. Полезно для разработки и отладки. <Appender type="Console" name="ConsoleAppender"> <Target>System.out</Target> </Appender> 🟠FileAppender Логи записываются в файл. Используется для длительного хранения логов. <Appender type="File" name="FileAppender"> <FileName>logs/app.log</FileName> <Append>true</Append> </Appender> 🟠RollingFileAppender Расширение FileAppender с возможностью ротации логов (ограничение размера файла, создание новых файлов при переполнении). <Appender type="RollingFile" name="RollingFileAppender"> <FileName>logs/app.log</FileName> <FilePattern>logs/app-%d{yyyy-MM-dd}.log</FilePattern> <Policies> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> </Appender> 🟠DailyRollingFileAppender Логи записываются в файл, который ротационно создаётся каждый день. <Appender type="DailyRollingFile" name="DailyRollingAppender"> <FileName>logs/app.log</FileName> <DatePattern>.yyyy-MM-dd</DatePattern> </Appender> 🟠SocketAppender Отправляет логи через сеть (TCP или UDP). Используется для централизованного логирования. 🟠JDBCAppender Записывает логи в базу данных. <Appender type="JDBC" name="JDBCAppender"> <ConnectionSource> <DriverManagerConnectionSource> <DriverCl
6 · 643 ·
J
🤔 В каких состояниях может находиться поток? Поток может находиться в следующих состояниях: - NEW — создан, но ещё не запущен; - RUNNABLE — выполняется или готов к выполнению; - BLOCKED — ожидает освобождения монитора; - WAITING — ожидает уведомления другого потока; - TIMED_WAITING — ожидает уведомления в течение ограниченного времени; - TERMINATED — завершён. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
4 · 689 ·
Java | Вопросы собесов
Фотография
нажмите — покажем
Ключевое ИБ-событие года SOC Forum — одно из крупнейших событий в сфере ИБ, которое проходит в рамках Российской недели кибербезопасности. ✅ Здесь встречаются эксперты, представители бизнеса и госструктур, чтобы обсудить ключевые вызовы отрасли. Событие, которое нельзя пропустить. Для тех, кто не может присутствовать лично, будет запущена онлайн-трансляция: 👌 Переключайтесь между залами. 👌 Выбирайте только актуальные для вас выступления. 👌 Задавайте вопросы спикерам в прямом эфире. 👌 Участвуйте в интерактивах. И все это не выходя из дома. Зарегистрируйтесь, и мы напомним о старте трансляции и пришлем ссылку, чтобы вы ничего не пропустили. Узнать больше #реклама 16+ registration.forumsoc.ru О рекламодателе
688 ·
🤔 Что такое сигнатура? Сигнатура метода – это его уникальная идентификация в классе. Она включает: Имя метода Список параметров (их типы и порядок) class Example { void print(String text) {} // Сигнатура: print(String) void print(int number) {} // Сигнатура: print(int) int print(String text, int number) { return 0; } // Сигнатура: print(String, int) } 🚩Почему сигнатура важна? 🟠Перегрузка методов (Method Overloading) В одном классе можно создавать методы с одинаковыми именами, но разными сигнатурами. class MathUtils { int sum(int a, int b) { return a + b; } // sum(int, int) double sum(double a, double b) { return a + b; } // sum(double, double) } 🟠Переопределение методов (Method Overriding) При переопределении метода (в наследовании) сигнатура ДОЛЖНА быть такой же. class Parent { void show() {} // Сигнатура: show() } class Child extends Parent { @Override void show() {} // ✅ Сигнатура совпадает, корректное переопределение } 🚩Ошибки, связанные с сигнатурой Ошибка: Возвращаемый тип НЕ влияет на сигнатуру class Test { int method(int x) { return x; } double method(int x) { return x; } // Ошибка! Сигнатура совпадает } Ставь 👍 и забирай 📚 Базу знаний
4 · 702 ·
🤔 Что необходимо для того чтобы клонировать один объект в другой? Для клонирования объекта нужно предусмотреть возможность копирования его состояния. Это может быть реализовано через поддержку специального механизма клонирования, который создаёт копию объекта. Клонирование может быть поверхностным (копируются только ссылки) или глубоким (копируются и вложенные объекты). Также важно учитывать, реализует ли класс необходимые соглашения для клонирования, чтобы обеспечить корректную работу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
2 · 679 ·
J
Фотография
нажмите — покажем
Надежные VDS-сервера в NetAngels от 130₽/месяц Подберем мощные VDS-сервер для любых задач. Техподдержка 24/7. Защита от DDoS-атак. Гибкая конфигурация. Бесплатный перенос VDS с сохранением всех данных. Попробуйте VDS-сервер от NetAngels уже сегодня! Перейти на сайт #реклама 16+ netangels.ru О рекламодателе
657 ·
Java | Вопросы собесов
🤔 Какие шаги нужно выполнить для прочтения текстового файла? Для прочтения текстового файла в Java нужно выполнить несколько шагов. 1⃣Выбор метода чтения файла В Java есть несколько способов читать текстовые файлы: 1. Использование класса FileReader. 2. Использование BufferedReader для построчного чтения. 3. Использование java.nio.file.Files для чтения всех строк файла. 4. Применение Scanner для гибкого чтения данных. 2⃣Открытие файла Нужно указать путь к файлу (абсолютный или относительный) и передать его в выбранный класс. Например: FileReader reader = new FileReader("file.txt"); 3⃣Чтение данных Выберите подходящий метод для обработки содержимого файла: - Построчное чтение. - Чтение символов. - Чтение всех строк сразу (например, через Files.readAllLines). 4⃣Закрытие ресурса Для освобождения системных ресурсов после работы с файлом нужно закрыть поток. Это делается вручную или с помощью конструкции try-with-resources. 🚩Примеры реализации Построчное чтение с BufferedReader import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileReadExample { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); // Вывод строки } } catch (IOException e) { System.out.println("Ошибка: " + e.getMessage()); } } } Чтение файла с помощью Files import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; import java.util.List; public class FileReadExample { public static void main(String[] args) { try { List<String> lines = Files.readAllLines(Paths.get("file.txt")); for (String line : lines) { System.out.println(line); } } catch (IOException e) { System.out.println("Ошибка: " + e.getMess
4 · 525 ·
J
🤔 Для чего нужно final для статического метода? Ключевое слово final у статического метода: - запрещает переопределение метода в подклассах. - Хотя статические методы не переопределяются как виртуальные, их можно скрыть (hide), и final предотвращает даже это. - Это способ защитить реализацию от изменения в иерархии. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
3 · 430 ·
Java | Вопросы собесов
Видео
tmpnuzp_789.mp4 · 39.9 МБ · нажмите — покажем
Срочно требуются дизайнеры в FIGMA. Обучим с нуля. Онлайн-программа с наставником и чатом. Внимание! 80% практики. ✅По результату обучения у вас будет портфолио из нескольких работ. ✅Сертификат о прохождении курса. ✅Возможность пройти полное обучение и получить карьерное сопровождение! Учитесь дизайну у профессионалов в Yudaev Shool. Переходи по кнопки: "Подробнее" и начинай свое обучение. Доступ 0 руб. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе
680 ·
🤔 К какому принципу ООП относится переопределение методов? Переопределение методов (Method Overriding) относится к полиморфизму – одному из ключевых принципов ООП. 🚩Как работает переопределение (`@Override`)? Переопределение (Overriding) – это когда подкласс изменяет поведение метода родительского класса. class Animal { void makeSound() { System.out.println("Какое-то животное издаёт звук"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("Гав-гав!"); } } class Cat extends Animal { @Override void makeSound() { System.out.println("Мяу!"); } } Используем полиморфизм public class Main { public static void main(String[] args) { Animal myAnimal = new Dog(); // Полиморфизм myAnimal.makeSound(); // Выведет "Гав-гав!" } } 🚩Переопределение = полиморфизм времени выполнения (Runtime Polymorphism) Перегрузка (Overloading) – полиморфизм времени компиляции (Compile-time). Переопределение (Overriding) – полиморфизм времени выполнения (Runtime). 🚩Когда нужно переопределять методы? Когда подкласс должен изменить поведение родительского класса. Когда работаем с абстрактными классами и интерфейсами. Когда используем полиморфизм для гибкости кода. Ставь 👍 и забирай 📚 Базу знаний
4 · 626 ·
J
🤔 Какая сложность вставки элемента в LinkedList? - O(1) — если вставка происходит в начало или конец (через указатель); - O(n) — если нужно найти позицию по индексу, т.к. происходит линейный проход. Физическая вставка — быстрая, но поиск позиции может быть медленным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
1 · 443 ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем