Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
32 photos
2 videos
1.13K links
Download Telegram
🤔 Когда происходит коллизия hashcode в HashMap?

Коллизия происходит, когда два разных ключа имеют одинаковое значение хеш-функции (hashCode). В этом случае элементы попадают в одну и ту же "корзину", и HashMap использует цепочки или дерево (с Java 8) для хранения таких элементов. Коллизии — это нормальное явление для хеш-таблиц, и важно, чтобы hashCode был распределён эффективно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Чем отличаются Web server и Application server?

🟠Web Server (веб-сервер)
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
🟠Application Server (сервер приложений)
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.

🚩Web Server (веб-сервер)

Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт example.com/index.html:
Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com


Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл index.html.
Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.

🚩Application Server (сервер приложений)

Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на example.com/login:
Браузер отправляет HTTP-запрос:

   POST /login HTTP/1.1
Host: example.com


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1🤔1
🤔 Расскажи об иерархии коллекций в Java?

Иерархия коллекций в Java организована вокруг интерфейса Collection, который является базовым для всех коллекций. Основные его наследники — это List (например, ArrayList, LinkedList), Set (например, HashSet, TreeSet) и Queue (например, LinkedList, PriorityQueue). Все эти коллекции управляют группами объектов. Для работы с парами "ключ-значение" существует интерфейс Map (например, HashMap, TreeMap), который не является частью Collection, но тесно связан с ним.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 К какому принципу ООП относится переопределение методов?

Переопределение методов (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).

🚩Когда нужно переопределять методы?

Когда подкласс должен изменить поведение родительского класса.
Когда работаем с абстрактными классами и интерфейсами.
Когда используем полиморфизм для гибкости кода.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 В чём разница между написанием String в двойных кавычках " и вызовом new String(...)?

- Когда ты пишешь строку в двойных кавычках, она помещается в String Pool — специальную область для хранения строк.
- При вызове new String("...") — создаётся новый объект в куче, даже если такая же строка уже есть в пуле. Это избыточно и неэффективно, если тебе не нужен отдельный объект.
Итог: "abc" — это ссылка на уже существующую строку из пула, а new String("abc") — новый экземпляр в памяти.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥2
🤔 Можно ли одновременно использовать в сервлете PrintWriter и ServletOutputStream?

Нет, одновременно использовать PrintWriter и ServletOutputStream в одном сервлете нельзя. Это связано с тем, что эти два класса работают с разными типами данных и открывают ответный поток в разных режимах — PrintWriter для символьных данных, а ServletOutputStream для байтовых данных.

🚩Почему нельзя использовать одновременно:

Типы потоков:
🟠`PrintWriter`: Предназначен для записи текстовых данных (символов и строк).
🟠`ServletOutputStream`: Предназначен для записи бинарных данных (байтов и массивов байтов).

Конфликт потоков: Открытие одного потока блокирует возможность открытия другого. Попытка использования обоих потоков в одном запросе приведет к исключению 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); // Пытаемся записать бинарные данные
}
}


Если требуется отправить как текстовые, так и бинарные данные, это нужно делать последовательно, разделяя логику на отдельные запросы или сервлеты.

Отправка текстовых данных:
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>");
}
}


Отправка бинарных данных:
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);
}
}


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

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


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

WHERE и HAVING используются для фильтрации записей, но они применяются на разных этапах выполнения запроса и имеют разные цели.

🚩WHERE

Применяется до агрегации данных. Это значит, что фильтрация происходит непосредственно на строках исходной таблицы или результата объединения таблиц, до того как произойдет любая операция группировки (GROUP BY) или агрегирования (SUM, COUNT, AVG и т.д.).
Используется для фильтрации строк, которые будут включены в результаты группировки или в финальный набор данных, если группировка не используется.
Не может использоваться для фильтрации агрегированных значений.
SELECT employee_id, SUM(salary)
FROM salaries
WHERE salary > 1000
GROUP BY employee_id;


🚩HAVING

Применяется после агрегации данных. Это означает, что фильтрация происходит уже на агрегированных результатах, полученных после применения GROUP BY и агрегатных функций.
Используется для фильтрации групп в результате запроса с группировкой.
Может использоваться только с GROUP BY или для фильтрации результатов, полученных с помощью агрегатных функций.
SELECT employee_id, SUM(salary)
FROM salaries
GROUP BY employee_id
HAVING SUM(salary) > 10000;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Какая будет скорость взятия элемента в ArrayList?

Доступ по индексу — O(1) (мгновенно), т.к. используется массив.


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

Символ-разделитель в пути к файлу зависит от операционной системы:

Windows использует обратный слеш (\)

  C:\Users\Username\Documents\file.txt



Linux / macOS используют прямой слеш (/)

  /home/user/documents/file.txt


🟠Как правильно работать с разделителями в Java?
В Java есть кроссплатформенный способ получения разделителя пути:
import java.io.File;

public class PathExample {
public static void main(String[] args) {
String path = "home" + File.separator + "user" + File.separator + "file.txt";
System.out.println("Путь: " + path);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🤔 Какие нововведения появились в Java 8 и JDK 8?

- Лямбда-выражения;
- Stream API;
- Функциональные интерфейсы;
- default-методы в интерфейсах;
- Optional;
- Nashorn JS Engine;
- Date/Time API (java.time);
- Улучшения в Collectors, Map, ConcurrentHashMap.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4
🤔 Как на Java писать веб-приложение?

Веб-приложение на Java – это серверное приложение, которое обрабатывает HTTP-запросы и отправляет ответы клиенту.

🚩Написание веб-приложения на Spring Boot

Установка зависимостей (Maven)
Создайте pom.xml и добавьте
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.2</version> <!-- Используйте актуальную версию -->
</dependency>
</dependencies>


Создание основного класса (точка входа)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyWebApp {
public static void main(String[] args) {
SpringApplication.run(MyWebApp.class, args);
}
}


Создание контроллера (обработка HTTP-запросов)**
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class MyController {

@GetMapping("/hello")
public String sayHello() {
return "Привет, это веб-приложение на Java!";
}
}


Теперь при открытии http://localhost:8080/api/hello сервер вернёт:
Привет, это веб-приложение на Java!


🚩Разработка фронтенда (HTML + Thymeleaf)

Если приложение рендерит страницы на сервере, используйте Thymeleaf.
Добавьте зависимость в pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>


Создайте HTML-шаблон (src/main/resources/templates/index.html)
<!DOCTYPE html>
<html>
<head>
<noscript>Главная страница</noscript>
</head>
<body>
<h1>Привет, <span th:text="${name}"></span>!</h1>
</body>
</html>


Создайте контроллер для отображения страницы
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebController {
@GetMapping("/")
public String home(Model model) {
model.addAttribute("name", "Гость");
return "index"; // Возвращает "index.html"
}
}


🚩Работа с базой данных (Spring Data JPA + PostgreSQL)

Добавьте зависимости в pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>


Настройте application.properties (подключение к БД)
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update


Создайте сущность (таблицу в БД)
import jakarta.persistence.*;

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;

// Геттеры и сеттеры
}


Создайте Repository для работы с БД
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}


Контроллер для работы с БД
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;

public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}

@GetMapping
public List<User> getUsers() {
return userRepository.findAll();
}

@PostMapping
public User addUser(@RequestBody User user) {
return userRepository.save(user);
}
}


Запустите приложение:
mvn spring-boot:run


Проверьте API через браузер или Postman
http://localhost:8080/users


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Какие выдвигаются требования к транзакции?

Транзакции должны соответствовать принципу ACID:
- Atomicity (атомарность) — выполняется вся транзакция или ничего.
- Consistency (согласованность) — данные переходят из одного корректного состояния в другое.
- Isolation (изолированность) — параллельные транзакции не мешают друг другу.
- Durability (долговечность) — после коммита данные сохраняются, даже при сбое.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊2
🤔 Для чего предназначены теги <dl>, <dt>, <dd>?

В HTML теги <dl>, <dt>, <dd> используются для создания списка определений. Этот список обычно применяется для отображения терминов и их описаний.

🚩Разбор тегов

🟠`<dl>` (Denoscription List, "список описаний")
это контейнер, в котором размещаются определения.
🟠`<dt>` (Definition Term, "термин")
обозначает термин, который нужно определить.
🟠`<dd>` (Definition Denoscription, "описание")
содержит описание или расшифровку термина.

<dl>
<dt>HTML</dt>
<dd>Язык разметки для создания веб-страниц.</dd>

<dt>CSS</dt>
<dd>Язык стилей, используемый для оформления HTML-документов.</dd>

<dt>JavaScript</dt>
<dd>Язык программирования, который добавляет интерактивность на веб-страницы.</dd>
</dl>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊17👍6🤔3
🤔 В чем разница между статическим и динамическим связыванием в Java?

- Статическое связывание происходит во время компиляции (например, перегруженные методы).
- Динамическое связывание происходит во время выполнения (например, переопределённые методы в полиморфизме).


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

Шардирование – это метод горизонтального разделения базы данных на несколько частей (шардов) для повышения производительности и масштабируемости.

🚩Популярные стратегии шардирования

🟠По диапазону (Range-Based Sharding)
Данные делятся по диапазону значений (например, ID 1–1000, 1001–2000).

🟠По хешу (Hash-Based Sharding)
Данные распределяются с помощью хеш-функции.
int shardNumber = userId % numberOfShards;


🟠Географическое (Geo-Based Sharding)
Данные разделяются по географическому признаку (например, Европа, Азия, США). Минимальная задержка (пользователь получает данные ближе к себе)
Некоторые регионы могут перегружаться.

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

Стек — это структура данных LIFO (последний вошёл — первый вышел).
В JVM стек создаётся для каждого потока и хранит:
- кадры вызова методов (stack frames);
- локальные переменные;
- информацию для возврата результата и адрес следующей инструкции.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Что такое 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>
<DriverClass>org.h2.Driver</DriverClass>
<Url>jdbc:h2:mem:logdb</Url>
<User>sa</User>
</DriverManagerConnectionSource>
</ConnectionSource>
<TableName>log_table</TableName>
</Appender>


🚩Конфигурация Appender в log4j2

Вот пример конфигурации с использованием нескольких Appender
XML-конфигурация
<Configuration>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</Console>
<File name="FileAppender" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>


Java-конфигурация
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);

public static void main(String[] args) {
logger.info("This is an info log");
logger.error("This is an error log");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Как вручную создать новый контекст?

С помощью:
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
или:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Это создаёт новый изолированный контекст, не связанный с текущим.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4
🤔 Расскажи про процесс от пуша кода до продакшена

Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью 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
noscript:
- kubectl apply -f deployment.yaml
only:
- main


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔1💊1
🤔 Чем отличается аннотация @Component от @Service?

Обе создают бин, но:
-
@Component — универсальная аннотация для любого компонента.
-
@Service — специализированная для бизнес-логики, служит для семантики, может участвовать в AOP или логировании.
В плане регистрации в контексте — поведение одинаковое.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11