Java | Вопросы собесов
11.4K subscribers
32 photos
2 videos
1.13K links
Download Telegram
🤔 Расскажи про процесс от пуша кода до продакшена

Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью CI/CD (Continuous Integration / Continuous Deployment).

🚩Этапы CI/CD

🟠Разработчик пушит код в Git-репозиторий
- Код отправляется в GitHub, GitLab, Bitbucket или другой репозиторий.
- Открывается Pull Request (PR) для ревью.
git add .
git commit -m "Добавлена новая фича"
git push origin feature-branch


🟠CI (Continuous Integration) – Автоматическая сборка и тестирование
После пуша CI-сервер (Jenkins, GitHub Actions, GitLab CI/CD, CircleCI)** запускает автоматические тесты и сборку.
Клонирование репозитория.
Сборка проекта (например, mvn package для Java).
Запуск юнит-тестов (JUnit, Mockito).
Запуск интеграционных тестов (например, TestContainers).
Анализ кода (SonarQube).
name: CI Pipeline

on:
push:
branches:
- main
- develop

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'

- name: Build project
run: mvn clean package

- name: Run tests
run: mvn test


🟠CD (Continuous Deployment) – Развёртывание на Staging
После успешного CI код автоматически разворачивается в стейджинг (staging) – это тестовая среда, похожая на продакшен.
Развёртывание может происходить с помощью:
Docker + Kubernetes (K8s)
AWS CodeDeploy, GitLab CD
Terraform + Ansible
FROM openjdk:17
COPY target/app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]


🟠Код проходит код-ревью и одобряется
Проверяется чистота кода, читаемость и ошибки.
В некоторых компаниях код проходит Security Review
git merge feature-branch
git push origin main


🟠CD (Continuous Deployment) – Развёртывание в продакшен
Blue-Green Deployment – новый код разворачивается на отдельном сервере, затем трафик переключается.
Canary Release – новый код деплоится на 5-10% пользователей, если всё хорошо – на всех.
Rolling Deployment – обновление происходит поэтапно, без даунтайма.
deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml
only:
- main


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍183🔥1
🤔 Что такое Java Server Pages (JSP)?

Это технология Java для создания динамических веб-страниц. JSP-файлы содержат HTML с вкраплениями Java-кода, который обрабатывается на сервере. Результат обработки — готовая HTML-страница, отправляемая клиенту.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2💊1
🤔 Что такое адаптер?

Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.

🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс OldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V).
Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}


Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}


Адаптер, который превращает 220V в 5V
class ChargerAdapter implements USBCharger {
private OldCharger oldCharger;

public ChargerAdapter(OldCharger oldCharger) {
this.oldCharger = oldCharger;
}

@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
oldCharger.charge220V();
}
}


Использование адаптера
public class Main {
public static void main(String[] args) {
OldCharger oldCharger = new OldCharger();
USBCharger adapter = new ChargerAdapter(oldCharger);

adapter.charge5V(); // Теперь старая зарядка работает с 5V!
}
}


Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (extends).
class ChargerAdapter extends OldCharger implements USBCharger {
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
charge220V();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2
🤔 В чём разница между StringBuilder и конкатенацией?

- StringBuilder — изменяемый буфер, оптимизирован для многократных операций со строками. Не создаёт новых строк при каждом изменении.
- Конкатенация (+) — при каждом объединении создаётся новый объект String, так как строки неизменяемы.
В цикле или при множественных объединениях StringBuilder работает гораздо быстрее.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥3💊3
🤔 Для чего нужны функциональные интерфейсы ToDoubleBiFunction<T,U>, ToIntBiFunction<T,U> и ToLongBiFunction<T,U>?

Эти три интерфейса – это функциональные интерфейсы из java.util.function, которые представляют функцию, принимающую два аргумента и возвращающую примитивный тип (double, int или long).

🚩`ToDoubleBiFunction<T, U>` – возвращает `double`

Этот интерфейс принимает два объекта и возвращает double.
import java.util.function.ToDoubleBiFunction;

public class Main {
public static void main(String[] args) {
ToDoubleBiFunction<Integer, Integer> average = (math, physics) -> (math + physics) / 2.0;

double result = average.applyAsDouble(85, 90);
System.out.println("Средний балл: " + result); // 87.5
}
}


🚩`ToIntBiFunction<T, U>` – возвращает `int`

Этот интерфейс принимает два объекта и возвращает int.
import java.util.function.ToIntBiFunction;

public class Main {
public static void main(String[] args) {
ToIntBiFunction<String, String> compareLength = (s1, s2) -> s1.length() - s2.length();

int result = compareLength.applyAsInt("Java", "Python");
System.out.println("Разница в длине строк: " + result); // -2 (Java=4, Python=6)
}
}


🚩`ToLongBiFunction<T, U>` – возвращает `long`

Этот интерфейс принимает два объекта и возвращает long.
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.function.ToLongBiFunction;

public class Main {
public static void main(String[] args) {
ToLongBiFunction<LocalDate, LocalDate> daysBetween = (start, end) ->
ChronoUnit.DAYS.between(start, end);

long days = daysBetween.applyAsLong(LocalDate.of(2024, 1, 1), LocalDate.of(2024, 3, 1));
System.out.println("Разница в днях: " + days); // 60
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Что такое процесс и поток, чем они отличаются?

Процесс — это самостоятельная программа, выполняющаяся в памяти, со своим адресным пространством. Поток — это последовательность инструкций, выполняемых внутри процесса и разделяющих его ресурсы. Потоки легче и быстрее создавать, так как они совместно используют ресурсы одного процесса.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 В чём заключается разница между методами start() и run()?

🚩`start()` – создаёт новый поток

Метод start() создаёт новый поток и вызывает run() внутри него.
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}

public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // Запускаем новый поток

System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}


Вывод (разные потоки работают параллельно)
Работает поток: main
Работает поток: Thread-0


🚩`run()` – выполняется в ТЕКУЩЕМ потоке (без создания нового)

Если вызвать run() напрямую, код просто выполнится как обычный метод, а не в новом потоке.
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.run(); // Ошибка! Работает в главном потоке

System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}


Вывод (run() работает в главном потоке, а не в новом)
Работает поток: main
Работает поток: main


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
🤔 Что такое Lambda?

Lambda — это анонимная функция, которая может быть передана как аргумент в метод или сохранена в переменную. Лямбда-выражения упрощают код, избавляя от необходимости создавать полноценные классы для реализации функциональных интерфейсов. Они часто используются для краткого описания логики,

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141🔥1
🤔 Почему нет смысла гнаться за 100% или 99.999% надежности, если есть 99.99%?

Чем выше гарантированное время безотказной работы (uptime), тем сложнее и дороже его обеспечить. Разница между 99.99% (четыре девятки) и 99.999% (пять девяток кажется небольшой, но в реальности разница огромна.

🚩Почему не стоит гнаться за 99.999%?

🟠Резкий рост затрат
Чтобы перейти с 99.99% на 99.999%, нужно:
Дублировать серверы и базы данных по всему миру.
Настроить мгновенное переключение (failover) без задержек.
Резервировать сети и балансировщики нагрузки.
Использовать дата-центры Tier 4 (очень дорого).

🟠Сложность обслуживания
Чтобы добиться 99.999%, любая перезагрузка сервера или обновление должны происходить без простоя.
Это требует сложных канареечных релизов, blue-green деплоя, автоматического восстановления систем.
Обслуживание становится намного сложнее и требует больше DevOps-инженеров.

🟠Пользователи не заметят разницы
Если ваш сервис недоступен 50 секунд в месяц, кто это заметит?
Большинство пользователей не обратят внимание на редкие микросбои.
Но если цена сервиса вырастет из-за затрат на 99.999% – они это заметят!

🟠Есть альтернативные решения
Если критически важно 99.999% (например, для финансовых систем или медицины), лучше использовать отказоустойчивую архитектуру, чем пытаться обеспечить идеальную надёжность одним дата-центром.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁4
🤔 Что такое JDK?

JDK (Java Development Kit) — это комплект разработчика Java. Он включает:
- Компилятор (javac) — преобразует код в байт-код.
- JRE — среду выполнения для запуска Java-программ.
- Инструменты: отладчик, документация, средства сборки.
- Используется для разработки, компиляции и запуска Java-программ.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4
🤔 Жизненный цикл сервлетов?

Сервлет – это Java-класс, который обрабатывает HTTP-запросы на сервере. Жизненный цикл сервлета управляется контейнером сервлетов (Tomcat, Jetty, WildFly) и проходит три стадии:

🚩Этапы жизненного цикла сервлета

🟠Инициализация (`init()`) – вызывается один раз
Когда первый клиент отправляет запрос, контейнер:
- Загружает класс сервлета в память.
- Вызывает init() (инициализация, например, подключение к БД).
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;

public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Сервлет инициализирован!");
}
}


🟠Обработка запросов (`service()`) – вызывается при каждом запросе
При каждом HTTP-запросе вызывается метод service(), который передаёт управление doGet(), doPost(), doPut(), doDelete().
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Обработка запроса: " + req.getMethod());
super.service(req, resp); // Передаёт запрос в doGet() или doPost()
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.getWriter().write("Привет, мир!");
}


🟠Удаление (`destroy()`) – вызывается при выключении сервера
Когда сервер останавливается, контейнер вызывает destroy(), чтобы освободить ресурсы (например, закрыть соединения с БД).
@Override
public void destroy() {
System.out.println("Сервлет уничтожен!");
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Forwarded from easyoffer
Я боялся, что провалю собеседование. Так появился easyoffer

Когда я только начинал искать первую работу программистом, меня пугала мысль, что я просто не смогу ответить на вопросы на собеседовании.

Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ.

Я реально боялся.
Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке.

📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал)

В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас.
Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?..

Тогда и пришла идея

А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном.

Так родился easyoffer.

Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект.

Сейчас я делаю EasyOffer 2.0
И уже не один, а вместе с вами.

В новой версии будут:
– вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью
– тренажёр с карточками (по принципу интервальных повторений — как в Anki)
– база задач с интервью
– тренажёр «реальное собеседование», чтобы отрепетировать как в жизни

Каждая фича упрощает и сокращает время на подготовку. Все эти штуки я бы мечтал иметь, когда сам готовился к собеседованиям.

Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я.

Если вы хотите помочь — сейчас самое важное время.
Краудфандинг уже стартовал. Благодаря нему я смогу привлечь больше людей для разработки, сбору и обработки собеседований.

Все, кто поддержат проект до релиза, получат:

🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам.
Доступ к закрытому бета-тесту

Поддержать 👉 https://planeta.ru/campaigns/easyoffer

Спасибо, что верите в этот проект 🙌
👍5💊4🔥1
🤔 Какие конструкции в обработке ошибок известны?

- try-catch: Перехват и обработка исключений.
- finally: Код, который выполняется независимо от того, возникло исключение или нет.
- throw: Выбрасывание исключений.
- throws: Объявление исключений в сигнатуре метода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Чем отличается обычный объект от Bean?

В Spring термин Bean (бин) означает объект, управляемый Spring-контейнером.

🟠Обычный объект (Java POJO)
Создаётся вручную, Spring о нём ничего не знает
class Car {
void drive() {
System.out.println("Машина едет...");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создаём объект вручную
car.drive();
}
}


🟠Spring Bean (управляемый объект)
Spring создаёт и управляет бином через аннотации.
import org.springframework.stereotype.Component;

@Component // Сообщает Spring, что этот класс - Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}


Теперь объект создаётся Spring-контейнером
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class); // Получаем Bean из Spring-контейнера
car.drive();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🤔 Что необходимо для того чтобы клонировать один объект в другой?

Для клонирования объекта нужно предусмотреть возможность копирования его состояния. Это может быть реализовано через поддержку специального механизма клонирования, который создаёт копию объекта. Клонирование может быть поверхностным (копируются только ссылки) или глубоким (копируются и вложенные объекты). Также важно учитывать, реализует ли класс необходимые соглашения для клонирования, чтобы обеспечить корректную работу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 В чем разница Spring Boot и Spring?

Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.

🚩Spring Framework

Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.

🚩Spring Boot

С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.

🚩Различия

🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.

🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.

🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 На фоне чего построена Spring Data?

Spring Data построена на:
- Шаблонном подходе к доступу к данным, например, через JdbcTemplate, MongoTemplate и т.д.
- Интерфейсах-репозиториях, где методы можно описывать декларативно, без реализации.
- ORM-фреймворках — Hibernate, JPA, MyBatis и других.
- Абстракции над разными хранилищами: SQL, NoSQL, REST, LDAP и т.п.
Она упрощает и стандартизирует работу с хранилищами, устраняя дублирование кода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊4🔥2🤯2
🤔 Bean это класс или объект?

Spring Bean – это ОБЪЕКТ, который управляется Spring-контейнером.

🚩Пример: Обычный класс vs. Bean

Обычный класс (НЕ Bean)
class Car {
void drive() {
System.out.println("Машина едет...");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создание обычного объекта вручную
car.drive();
}
}


Bean в Spring
import org.springframework.stereotype.Component;

@Component // Аннотация говорит Spring, что этот класс – Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class); // Получаем объект из Spring-контейнера
car.drive();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊2