Java | Вопросы собесов
11.4K subscribers
41 photos
4 videos
1.54K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Используешь в работе Lambda-выражения?

Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java:

🟠Итерация по коллекциям
Использование лямбда-выражений с методом forEach позволяет компактно и удобно итерировать по элементам коллекций.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));


🟠Фильтрация и преобразование коллекций
С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());

filteredNames.forEach(System.out::println); // Вывод: Alice


🟠Сортировка коллекций
Лямбда-выражения упрощают сортировку коллекций с использованием метода sort.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((name1, name2) -> name1.compareTo(name2));
names.forEach(System.out::println);


🟠Использование функциональных интерфейсов
Лямбда-выражения широко используются с функциональными интерфейсами, такими как Predicate, Function, Consumer и Supplier.
// Predicate
Predicate<String> startsWithA = s -> s.startsWith("A");
boolean result = startsWithA.test("Alice"); // true

// Function
Function<String, Integer> lengthFunction = s -> s.length();
int length = lengthFunction.apply("Hello"); // 5

// Consumer
Consumer<String> printConsumer = s -> System.out.println(s);
printConsumer.accept("Hello, World!"); // Вывод: Hello, World!

// Supplier
Supplier<String> stringSupplier = () -> "Hello, Supplier!";
String suppliedString = stringSupplier.get();
System.out.println(suppliedString); // Вывод: Hello, Supplier!


🟠Параллельные вычисления
Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.mapToInt(Integer::intValue)
.sum();

System.out.println("Sum: " + sum); // Вывод: Sum: 15


🚩Пример использования в реальном проекте

Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени.
import java.util.*;
import java.util.stream.Collectors;

class Employee {
private String name;
private int age;

public Employee(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

@Override
public String toString() {
return "Employee{name='" + name + "', age=" + age + '}';
}
}

public class LambdaExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", 30),
new Employee("Bob", 25),
new Employee("Charlie", 35),
new Employee("David", 28)
);

// Фильтрация и сортировка сотрудников по имени
List<Employee> filteredAndSorted = employees.stream()
.filter(e -> e.getAge() > 27)
.sorted(Comparator.comparing(Employee::getName))
.collect(Collectors.toList());

filteredAndSorted.forEach(System.out::println);
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое FutureTask?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Что стоит в центре парадигмы?

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

🚩Процедурное программирование

Код строится вокруг последовательности инструкций.
Данные изменяются с помощью вызова функций (процедур).
Пример: C, Pascal.
int sum(int a, int b) {
return a + b;
}

int main() {
int result = sum(5, 3);
printf("%d", result);
return 0;
}


🚩Объектно-ориентированное программирование (ООП)

Мир представляется в виде объектов, у которых есть состояние (поля) и поведение (методы).
Используются принципы: инкапсуляция, наследование, полиморфизм.
Пример: Java, C++, Python.
class Car {
private String model;

public Car(String model) {
this.model = model;
}

public void drive() {
System.out.println(model + " едет!");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car("Tesla");
car.drive(); // Tesla едет!
}
}


🚩Функциональное программирование (FP)

Использование чистых функций (без изменения состояния).
Избегание побочных эффектов и мутабельности.
Пример: Haskell, Scala, Kotlin, Java (Stream API).
import java.util.List;

public class Main {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
numbers.stream()
.map(n -> n * 2) // Умножаем каждый элемент на 2
.forEach(System.out::println); // Вывод результата
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍3💊2
🤔 Гарантирует ли HashMap указанную сложность выборки элемента?

Только при равномерном распределении хешей — да, O(1).
Если ключи имеют коллизии, и корзины переполнены — время может увеличиться до O(log n) (в случае использования TreeNodes) или O(n) (в старых версиях).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3💊1
🤔 Каким образом можно заставить поток выполнится приоритет и есть ли такая возможность в Java?

В Java у каждого потока есть приоритет, но он не гарантирует порядок выполнения.

🟠Использование `setPriority(int priority)`
Java позволяет задавать приоритет потока с помощью метода setPriority(), который принимает значение от 1 до 10:
Thread.MIN_PRIORITY (1) – минимальный приоритет
Thread.NORM_PRIORITY (5) – стандартный приоритет (по умолчанию)
Thread.MAX_PRIORITY (10) – максимальный приоритет
class MyThread extends Thread {
public MyThread(String name, int priority) {
super(name);
setPriority(priority);
}

@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " выполняется с приоритетом " + getPriority());
}
}
}

public class Main {
public static void main(String[] args) {
MyThread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
MyThread high = new MyThread("High Priority", Thread.MAX_PRIORITY);

low.start();
high.start();
}
}


🟠Почему `setPriority()` не даёт 100% контроль?
Приоритет – это всего лишь рекомендация для ОС.
Распределение процессорного времени зависит от планировщика ОС.
В Windows, Linux, macOS приоритеты работают по-разному, и Java не контролирует их на низком уровне.

🟠Как действительно заставить поток выполниться первым?
Реальные способы управления порядком выполнения:
а) Использование join()
Позволяет дождаться выполнения одного потока перед запуском другого.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
Thread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);

high.start();
high.join(); // Ждём, пока high завершится

low.start(); // Теперь запускается low
}
}


б) Использование Executors.newSingleThreadExecutor()
Позволяет гарантированно выполнять потоки по очереди.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();

executor.submit(() -> System.out.println("Задача 1"));
executor.submit(() -> System.out.println("Задача 2"));

executor.shutdown();
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Как у класса заполнить атрибуты?

Атрибуты класса (поля) можно заполнить:
- через конструктор;
- через сеттеры;
- через аннотации Spring (
@Autowired, @Value);
- через внедрение зависимостей или маппинг объектов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Чем отличаются методы Thread.sleep() и Thread.yield()?

Методы Thread.sleep() и Thread.yield() в Java используются для управления потоком, но работают по-разному.

🚩Thread.sleep()

Метод Thread.sleep(milliseconds) приостанавливает выполнение текущего потока на указанное время.

🚩Как это работает?

Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).

public class SleepExample {
public static void main(String[] args) {
System.out.println("Начало работы...");
try {
Thread.sleep(2000); // Пауза на 2 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Прошло 2 секунды");
}
}


Результат
Начало работы...
(пауза 2 секунды)
Прошло 2 секунды


🚩Thread.yield()

Метод Thread.yield() даёт возможность другим потокам выполнить работу.

🚩Как это работает?

Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.

public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
Thread.yield(); // Позволяет другим потокам выполняться
}
};

Thread t1 = new Thread(task, "Поток-1");
Thread t2 = new Thread(task, "Поток-2");

t1.start();
t2.start();
}
}


Результат (примерный, зависит от планировщика ОС)
Поток-1 - 1
Поток-2 - 1
Поток-1 - 2
Поток-2 - 2
...


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Какой шаблон проектирования применен для StringBuilder и StringBuffer?

Используется шаблон проектирования "Строитель" (Builder), так как оба класса позволяют поэтапно конструировать строку, а не создавать новую при каждом изменении, как String.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Что такое heap, stack?

В контексте Java, Heap (куча) и Stack (стек) являются областями памяти, используемыми JVM для управления памятью, необходимой для выполнения программы. Каждая из этих областей имеет свои характеристики и используется для разных целей.

🚩Heap (Куча)

Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора new, размещаются в куче.

🟠Особенности
Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation).
Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1).
Старое поколение хранит долгоживущие объекты.

🟠Управление памятью
Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются.

🟠Использование
Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.

public class Example {
public static void main(String[] args) {
Example obj = new Example(); // obj создается в куче
}
}


🚩Stack (Стек)

Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах.

🟠Особенности
Каждый поток имеет свой собственный стек.
Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах.

🟠Управление памятью
Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека.

🟠Использование
Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче.
Локальные переменные методов и параметры методов хранятся в стеке.

public class Example {
public static void main(String[] args) {
int localVar = 10; // localVar хранится в стеке
Example obj = new Example(); // Ссылка на obj хранится в стеке, а сам объект — в куче
obj.method();
}

public void method() {
int anotherVar = 20; // anotherVar хранится в стеке
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Какие существуют типы связей в базе данных, приведите примеры?

- Один к одному (One-to-One): человек и паспорт;
- Один ко многим (One-to-Many): автор и книги;
- Многие ко многим (Many-to-Many): студенты и курсы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Какие виды тестов знаешь?

В программировании существует множество видов тестирования, которые можно разделить на категории по уровню тестирования, методам выполнения и целям. Вот основные виды:

🚩По уровню тестирования

🟠Модульное тестирование (Unit Testing)
Тестирование отдельных методов или классов.
Цель: Проверить работу минимальных компонентов программы.
Инструменты: JUnit, TestNG.

  @Test
public void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}


🟠Интеграционное тестирование (Integration Testing)
Тестирование взаимодействия между модулями.
Цель: Убедиться, что модули правильно работают вместе.
Пример: Проверка взаимодействия сервиса и базы данных.
Инструменты: Spring Test, Apache Camel Test.

🟠Системное тестирование (System Testing)
Проверка всей системы как единого целого.
Цель: Убедиться, что все компоненты работают вместе и система соответствует требованиям.

🟠Приемочное тестирование (Acceptance Testing)
Проводится с участием клиента или конечных пользователей.
Цель: Убедиться, что система удовлетворяет бизнес-требованиям.

🚩По методам выполнения

🟠Ручное тестирование (Manual Testing)
Тесты выполняются вручную.
Цель: Найти ошибки, которые может не уловить автоматизация.
Пример: Тестировщик вручную проверяет пользовательский интерфейс.

🟠Автоматизированное тестирование (Automated Testing)
Тесты выполняются автоматически с использованием скриптов и инструментов.
Цель: Снизить время и затраты на повторяющиеся тесты.
Инструменты: Selenium, JUnit, Appium.

🚩По целям тестирования

🟠Функциональное тестирование
Проверяет, что функции системы работают как ожидалось.
Цель: Убедиться в соответствии требованиям.
Инструменты: Selenium, Postman.

🟠Нефункциональное тестирование
Тестирование производительности (Performance Testing): Проверяет скорость, отклик и стабильность.
Инструменты: JMeter, Gatling.
Тестирование безопасности (Security Testing): Проверяет защиту системы.
Инструменты: OWASP ZAP, Burp Suite.
Тестирование удобства использования (Usability Testing): Проверяет интерфейс на удобство для пользователя.

🚩По типам тестирования

🟠Smoke Testing
Быстрая проверка работоспособности ключевых функций.
Цель: Убедиться, что основные функции работают, прежде чем углубляться в тесты.

🟠Регрессионное тестирование
Проверяет, что новые изменения не сломали старую функциональность.
Цель: Убедиться, что баги, исправленные ранее, не повторились.

🟠Тестирование черного ящика (Black Box Testing)
Проверяет систему без знаний о внутреннем устройстве.
Цель: Оценить функциональность с точки зрения пользователя.

🟠Тестирование белого ящика (White Box Testing)
Проверяет систему с учетом внутренней структуры кода.
Цель: Оценить корректность логики программы.

🚩Специальные виды тестирования

🟠A/B тестирование
Проверяет, какая версия системы лучше (например, два варианта интерфейса).
Цель: Повысить пользовательский опыт.

🟠Тестирование нагрузки (Load Testing)
Проверяет, как система работает под большой нагрузкой.
Инструменты: Apache JMeter.

🟠Тестирование на отказоустойчивость (Stress Testing)
Проверяет, как система работает в условиях сверхвысокой нагрузки.

Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое JSON?

JSON (JavaScript Object Notation) — текстовый формат для хранения и обмена структурированными данными.
Характеристики:
- Ключ-значение (как у Map).
- Поддерживает типы: строки, числа, логические значения, массивы, объекты.
- Универсален, человекочитаем, легко парсится в разных языках (Java, JS, Python и т.д.).


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

Главное отличие:
@RequestMapping – универсальная аннотация, поддерживающая все HTTP-методы (GET, POST, PUT, DELETE и т. д.).
@PutMapping – специализированная аннотация для PUT-запросов.

🚩`@RequestMapping` – универсальная аннотация

Можно использовать для любого HTTP-метода (GET, POST, PUT, DELETE). Необходимо явно указывать method = RequestMethod.PUT, если нужен PUT.
@RestController
@RequestMapping("/users")
public class UserController {

@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String updateUser(@PathVariable Long id, @RequestBody String userData) {
return "Пользователь с ID " + id + " обновлён!";
}
}


🚩`@PutMapping` – упрощённый способ для `PUT`-запросов

Это специализированная аннотация, эквивалентная @RequestMapping(method = RequestMethod.PUT).
@RestController
@RequestMapping("/users")
public class UserController {

@PutMapping("/{id}")
public String updateUser(@PathVariable Long id, @RequestBody String userData) {
return "Пользователь с ID " + id + " обновлён!";
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Что такое модификаторы доступа и какие они есть?

Модификаторы доступа управляют видимостью классов, методов и полей:
1. public: доступен всем.
2. protected: доступен в том же пакете и наследникам.
3. default (пакетный): доступен только в пределах пакета.
4. private: доступен только внутри класса.


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