Java | Вопросы собесов
11.4K subscribers
33 photos
2 videos
1.13K links
Download Telegram
🤔 Чем полезны неизменяемые (Immutable) объекты в Java?

Неизменяемые (immutable) объекты не могут быть изменены после создания.
Если нужно изменить данные – создаётся новый объект.

🚩Почему неизменяемые объекты полезны?

🟠Потокобезопасность (Thread Safety)
Неизменяемые объекты можно безопасно использовать в многопоточной среде – их не нужно синхронизировать.
String message = "Hello";
String newMessage = message.replace("H", "J");

System.out.println(message); // Hello
System.out.println(newMessage); // Jello


🟠Отсутствие неожиданных изменений (безопасность данных)
Если объект неизменяемый, его нельзя случайно изменить.
class BankAccount {
private final String accountNumber;

public BankAccount(String accountNumber) {
this.accountNumber = accountNumber;
}

public String getAccountNumber() {
return accountNumber;
}
}


🟠Упрощает отладку и поддержку кода
Изменяемые объекты могут менять состояние в неожиданный момент.
List<String> list = new ArrayList<>();
list.add("Java");

modifyList(list); // Метод может изменить список!

System.out.println(list); // Ожидаем ["Java"], но может быть что угодно!


🟠Можно использовать в качестве ключей в `HashMap` и `HashSet`
Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в HashMap.
Map<String, String> map = new HashMap<>();
map.put("key", "value");

System.out.println(map.get("key")); // Всегда "value", так как String неизменяемый


🟠Совместимость с кэшем (например, в Hibernate, Spring)
Неизменяемые объекты можно безопасно кешировать, так как они не меняются.

🚩Как создать неизменяемый класс?

Все поля private final.
Нет сеттеров.
Если есть массивы или списки – копируем их перед возвратом.
final class Person {
private final String name;
private final int age;

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

public String getName() {
return name;
}

public int getAge() {
return age;
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Forwarded from easyoffer
Что такое PRO-подписка на easyoffer 2.0?

easyoffer PRO — это не просто доступ к базе, а полноценный инструмент для получения оффера.

🧠 База вопросов с собеседований

+ Анализ на основе 4,000 собеседований
+ Вероятность встречи каждого вопроса
+ Фильтрация по грейдам, компаниям, типам интервью
+ Примеры ответов: текстовые и видео
+ Готовьтесь к собеседованию в конкретную компанию

🛠 Тренажер "Проработка вопросов"

+ Флеш-карточки + интервальные повторения
+ Персональная система показа карточек в зависимости от ваших ответов
+ Упор на наиболее частые вопросы
+ Фокус на слабые места и быстрый прогресс

🎭 Тренажер "Реальное собеседование"

+ Сценарии на основе реальных интервью
+ Подготовка к конкретным компаниям
+ Итоговая статистика: прошёл/не прошёл

🧩 База задач с собеседований

+ Live-coding и System Design задачи
+ Оценка вероятности встречи задачи
+ Подготовка к задачам по конкретным компаниям

📋 База тестовых заданий

+ Задания из реальных вакансий
+ Фильтрация по технологиям и грейдам
+ Лучшие решения в доступе

📈 Тренды технологий в вакансиях

+ Топ-100 навыков, которые требуют компании
+ Динамика популярности технологий
+ Фильтрация по грейдам

🎁 Специальная цена до релиза:
3200 руб. за целый год

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

Предзаказ здесь: https://planeta.ru/campaigns/easyoffer

📌 Цена поднимется сразу после запуска.

Если вы хотите перестать угадывать, что спросят на собеседовании, и начать точечно готовиться на основе реальных данных — easyoffer PRO именно для вас.

Экономьте время. Получайте оффер легко.
💊3🤔1
🤔 Каким образом можно добавить ограничения?

Ограничения (constraints) добавляют:
- в момент создания таблицы — в CREATE TABLE;
- позже — через ALTER TABLE.
Типы ограничений:
- PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊14👍7🔥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();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Почему Java – независимая платформа?

1. Принцип "Write Once, Run Anywhere" – код компилируется в байт-код, исполняемый JVM на любой ОС.
2. JVM адаптирует код к среде, абстрагируя различия между ОС.
3. Не зависит от процессорной архитектуры, так как работает через интерпретатор (JVM) или JIT-компилятор.


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

В Spring оба термина – Bean и Component – связаны с управляемыми объектами, но у них разное предназначение.

🚩Что такое `@Component`?

@Component делает класс Spring-бином автоматически.
Spring сам создаст и зарегистрирует объект в контейнере.
import org.springframework.stereotype.Component;

@Component
public class Car {
public void drive() {
System.out.println("Машина едет...");
}
}


Как получить объект?
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);
car.drive();
}
}


🚩Что такое `@Bean`?

@Bean создаёт Bean вручную в @Configuration-классе.
Можно использовать, если нужно передать параметры или создать Bean из библиотеки.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car(); // Создаём объект вручную
}
}


Как получить Bean?
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);


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

Параллельные стримы используют ForkJoinPool, а именно его общий (common) пул потоков.
Он применяет алгоритм fork-join:
- разбивает задачи на подзадачи,
- распределяет их между потоками.
Это позволяет выполнять операции над потоками в разных потоках параллельно, если они не зависят друг от друга.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🤔 Слышал ли что то про метод intern?

Метод intern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.

🚩Как работает `intern()`?

Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");

System.out.println(s1 == s2); // false (разные объекты)


С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();

System.out.println(s1 == s2); // true (одна строка в String Pool)


🚩Что такое `String Pool`?

Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект

System.out.println(s1 == s2); // true


🚩Когда использовать `intern()`?

Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Forwarded from easyoffer
📅 Осталось 7 дней до конца краудфандинга

Мы на финишной прямой!

Если ты планировал присоединиться, но ещё не успел, сейчас идеальный момент.

Вознаграждения за поддержку:

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

👉 Поддержать easyoffer 2.0

Не откладывай на последний момент

📌 Если не получается оплатить через карту РФ — напишите мне @kivaiko, и мы найдём удобный способ
🤔 Как работает оператор try with resources?

Оператор try with resources автоматически закрывает ресурсы (например, файлы, потоки), реализующие интерфейс AutoCloseable, после завершения блока try.

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

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

🟠Важные методы `Object` (базовые для всех классов)
Каждый класс в Java наследует Object, поэтому эти методы важны для любой программы.
class Person {
String name;

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}

@Override
public int hashCode() {
return name.hashCode();
}
}


🟠Важные методы `String` (работа со строками)
Строки в Java неизменяемы, поэтому методы создают новые объекты.
String text = "  Hello, Java!  ";
System.out.println(text.trim().toUpperCase()); // "HELLO, JAVA!"


Важные методы List, Set, Map (коллекции)
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
System.out.println(names.get(0)); // Alice

Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Alice");
System.out.println(uniqueNames.size()); // 1 (дубликат не добавился)


🚩Методы `Map` (HashMap, TreeMap)

Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
System.out.println(ages.get("Alice")); // 25


Stream API позволяет работать с данными декларативно.
List<String> names = List.of("Alice", "Bob", "Charlie");

names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);


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

Load factor (коэффициент загрузки) в HashMap определяет, когда нужно расширять таблицу.
Он показывает, при каком проценте заполнения текущей емкости хеш-таблицы происходит ре-хеширование.
По умолчанию load factor = 0.75, что означает:
- Когда заполнено 75% ячеек, создаётся новый, в 2 раза больший массив, и все элементы пересчитываются.
Это баланс между:
- скоростью доступа;
- потреблением памяти.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5
🤔 В чем разница между 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 + " обновлён!";
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊2
🤔 Может ли возникнуть ситуация, когда два потока портят друг друга?

Да, это называется гонка данных (race condition):
- два потока одновременно обращаются к общему ресурсу;
- меняют состояние друг друга, не зная об этом;
- результат — непредсказуемое поведение или порча данных.


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

Поверхностное копирование (Shallow Copy) – это процесс создания нового объекта, который содержит ссылки на те же вложенные объекты, что и оригинал.

🟠Как сделать поверхностное копирование в Java?
Способ 1: Метод clone() (реализация Cloneable)
class Person implements Cloneable {
String name;

public Person(String name) {
this.name = name;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person original = new Person("Иван");
Person copy = (Person) original.clone();

System.out.println(copy.name); // Иван
}
}


🟠Проблема с вложенными объектами (общие ссылки)
Если объект содержит вложенные объекты, они не копируются, а передаются по ссылке.
class Address {
String city;
public Address(String city) { this.city = city; }
}

class User implements Cloneable {
String name;
Address address;

public User(String name, Address address) {
this.name = name;
this.address = address;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Москва");
User original = new User("Иван", address);
User copy = (User) original.clone();

copy.address.city = "Санкт-Петербург"; // Меняем адрес у копии

System.out.println(original.address.city); // Санкт-Петербург (изменилось и у оригинала!)
}
}


🟠Как сделать глубокую копию? (Deep Copy)
Решение: Создать новый вложенный объект в clone()
@Override
protected Object clone() throws CloneNotSupportedException {
User clonedUser = (User) super.clone();
clonedUser.address = new Address(this.address.city); // Копируем вложенный объект
return clonedUser;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Forwarded from easyoffer
Офигеть, вот это поддержка! 🔥

Скажу честно: когда я планировал запуск краудфандинговой кампании, в голове были разные варианты развития событий. Думал — ну, наверное, получится собрать 300 тысяч. В самом идеальном сценарии — может быть, миллион.

Но больше всего я боялся, что запущу кампанию, и не получится собрать даже 300 т. Это был бы провал. Так много усилий, времени и денег вложено в проект… и если бы всё закончилось ничем — это бы сильно демотивировало.

Но, ребята, мы превысили изначальную цель в 10 раз —
3 031 040 рублей! 🤯

Вся эта кампания — это одна большая проверка бизнес-модели на прочность. И я супер рад, что запустил всё публично. Люди видят, что EasyOffer реально нужен. Теперь нет сомнений — проект актуален, он будет прибыльным и будет развиваться.

Мне приходит огромное количество сообщений в личку: кто-то когда-то давно пользовался сайтом, он помог с трудоустройством, и сейчас они уже не ищут работу — но всё равно поддержали.
Это прям очень круто и трогательно.

Никак не могу отделаться от мысли, что easyoffer — это ведь мой первый сайт. Учебный, пет-проект, просто для портфолио. И вот что из него вышло. Просто офигеть.

Я не зря ушёл с работы, чтобы заниматься только им.
Я поверил в этот проект — и сейчас вижу, что вы тоже в него верите. Для меня это очень многое значит.

Огромное спасибо за вашу поддержку! ❤️
🤔 В чём заключается идея foreign key?

Foreign key (внешний ключ) — это ограничение, которое:
- создаёт связь между двумя таблицами;
- указывает, что значение в одной таблице (дочерней) ссылается на primary key в другой (родительской);
- обеспечивает целостность данных: нельзя вставить несуществующую ссылку, или удалить запись, на которую есть ссылка (если нет ON DELETE CASCADE).


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

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

🚩Зачем она нужна

🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.

🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.

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

🚩Как она реализуется

🟠Ключевое слово synchronized
Может использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.

🟠Явные блокировки с использованием классов из пакета java.util.concurrent.locks
Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.

🟠Волатильные переменные (volatile)
Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Forwarded from easyoffer
Осталось 3 дня!

Финальный отсчёт пошёл — осталось всего 3 дня до окончания краудфандинга easyoffer 2.0

Сейчас можно получить максимум пользы за минимальные деньги. После окончания кампании цены вырастут и вознаграждения станут недоступны.

👉 Поддержи easyoffer 2.0 и получи:

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

Поддержи проект сейчас, чтобы не забыть!

📌 Если не получается оплатить через карту РФ — напишите мне @kivaiko, и мы найдём удобный способ
🤔 В чём заключается и как используется клонирование объектов, массивов и двумерных массивов?

- Клонирование объектов:
- Нужно реализовать интерфейс Cloneable.
- Переопределить метод clone.
- Позволяет создать копию объекта.
- Клонирование массивов:
- Одномерные — копируются методом clone() или Arrays.copyOf.
- Двумерные — clone() создаёт поверхностную копию, нужно вручную копировать вложенные массивы для глубокого клонирования.
Используется, когда нужно сохранить исходные данные и работать с копией.


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

Ограничения (constraints) – это правила, которые ограничивают возможные значения данных или ограничивают поведение системы.

🟠Ограничения в базах данных (SQL Constraints)
В SQL ограничения гарантируют корректность данных в таблицах.
CREATE TABLE Users (
id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
age INT CHECK (age > 0),
country VARCHAR(50) DEFAULT 'Unknown'
);


🟠Ограничения в Java Generics (`<T extends ...>`)
Ограничения в Generics позволяют задавать допустимые типы.
class Box<T> {
T value;
public Box(T value) { this.value = value; }
}
Box<String> strBox = new Box<>("Hello");
Box<Integer> intBox = new Box<>(10);

class NumberBox<T extends Number> { // Ограничение: T должно быть числом
T value;
public NumberBox(T value) { this.value = value; }

public double square() {
return value.doubleValue() * value.doubleValue();
}
}


🟠Ограничения в потоках (synchronized, volatile, join)
В многопоточности ограничения помогают избежать гонок потоков.
class Counter {
private int count = 0;

public synchronized void increment() { // Только один поток может изменять count одновременно
count++;
}
}


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