Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
32 photos
2 videos
1.13K links
Download Telegram
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
🤔 В чём разница между TreeSet и HashSet?

- TreeSet: хранит элементы в отсортированном порядке, основан на красно-чёрном дереве, имеет медленную вставку и доступ.
- HashSet: хранит элементы в произвольном порядке, основан на хэш-таблице, обеспечивает быструю вставку и доступ.


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

JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) – это языки запросов, похожие на SQL, но работающие с объектами, а не с таблицами БД.
Главное отличие: JPQL – стандарт JPA, а HQL – специфичен для Hibernate.

🚩JPQL (Java Persistence Query Language)

Стандартный язык JPA, работает со всеми JPA-совместимыми провайдерами (Hibernate, EclipseLink, OpenJPA).
Опирается на JPA Entity-классы, а не на реальные таблицы в БД.
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.age > :age", User.class);
query.setParameter("age", 18);
List<User> users = query.getResultList();


🚩HQL (Hibernate Query Language)

Язык запросов специфичный для Hibernate.
Работает аналогично JPQL, но поддерживает дополнительные возможности, например, вызов методов и фильтрацию по подзапросам.
Query query = session.createQuery(
"FROM User u WHERE LENGTH(u.name) > 5"); // Использование функции LENGTH()
List<User> users = query.list();


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

JRE (Java Runtime Environment) — это среда, необходимая для запуска Java-приложений.
Она включает:
- JVM (Java Virtual Machine)
- Библиотеки классов (Java API)
- Некоторые утилиты (но не включает компилятор, в отличие от JDK)
JRE подходит тем, кто использует Java-программы, а не разрабатывает их.


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

🚩`Builder` – создание сложных объектов

Когда у объекта много параметров.
Когда объект трудно создавать через конструктор.
class Car {
private String engine;
private int wheels;
private boolean sunroof;

private Car(CarBuilder builder) {
this.engine = builder.engine;
this.wheels = builder.wheels;
this.sunroof = builder.sunroof;
}

public static class CarBuilder {
private String engine;
private int wheels;
private boolean sunroof;

public CarBuilder setEngine(String engine) {
this.engine = engine;
return this;
}

public CarBuilder setWheels(int wheels) {
this.wheels = wheels;
return this;
}

public CarBuilder setSunroof(boolean sunroof) {
this.sunroof = sunroof;
return this;
}

public Car build() {
return new Car(this);
}
}
}


Создаём объект пошагово
Car car = new Car.CarBuilder()
.setEngine("V8")
.setWheels(4)
.setSunroof(true)
.build();


🚩`Facade` – упрощение сложной системы

Когда у системы много сложных классов, и вы хотите предоставить один упрощённый интерфейс.
Когда нужно скрыть детали реализации от клиента.
class CPU {
void start() { System.out.println("Процессор запущен."); }
}

class Memory {
void load() { System.out.println("Память загружена."); }
}

class HardDrive {
void read() { System.out.println("Чтение данных с диска."); }
}


Создаём Facade, который скрывает сложность
class ComputerFacade {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;

public ComputerFacade() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}

public void startComputer() {
cpu.start();
memory.load();
hardDrive.read();
System.out.println("Компьютер включен!");
}
}


Теперь клиенту не нужно вызывать кучу методов
ComputerFacade computer = new ComputerFacade();
computer.startComputer(); // Запускает всю систему через 1 метод


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

В интерфейсах:
- Поля всегда:
- public
- static
- final
- То есть это константы.
- Методы по умолчанию:
- public abstract — если не указано явно (для обычных методов).
- public default — если метод с реализацией.
- public static — для утилит.


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

JVM (Java Virtual Machine) управляет памятью приложения и делит её на несколько областей.

🟠Heap (Куча) – область для объектов
Здесь хранятся ВСЕ объекты и массивы, созданные через new.
Управляется Garbage Collector (GC)

🟠Stack (Стек) – область для методов и переменных
Локальные переменные (int, double, String – если не new)
Ссылки на объекты в Heap
Вызовы методов (кадры стека)
public class StackExample {
public static void main(String[] args) {
int a = 5;
int b = sum(a, 10);
}

public static int sum(int x, int y) {
return x + y;
}
}


🟠Metaspace – метаданные классов
Хранит информацию о загруженных классах (названия, методы, поля, байт-код).
При загрузке нового класса ClassLoader выделяет память в Metaspace.
В Java 8 заменил устаревший PermGen.
while (true) {
ClassLoader loader = new MyClassLoader();
Class<?> clazz = loader.loadClass("MyDynamicClass");
}


🟠Program Counter (PC Register)
Хранит адрес текущей инструкции, выполняемой потоком.
У каждого потока свой PC Register.
Работает как указатель в машинном коде.

🟠Native Method Stack
Хранит данные, связанные с вызовами нативных методов (JNI – Java Native Interface).
Если Java вызывает C++-код, информация о вызове хранится здесь.
public class NativeExample {
public native void callCMethod();
}


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

Сейчас самое подходящее время подключиться, если вы ждали или откладывали:

Все, кто поддержат проект сейчас, до релиза, получат:
🚀 PRO-доступ на 1 год по цене месячной подписки
Бета-доступ к EasyOffer 2.0 (конец мая)

👉 Поддержать: https://planeta.ru/campaigns/easyoffer
🤔 Как получить доступ к переопределённым методам родительского класса?

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


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

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

Примером этого может служить интерфейс java.util.function.Predicate<T> который принимает объект типа T и возвращает значение типа boolean. Вот пример использования:
Predicate<String> isNotEmpty = s -> !s.isEmpty();
System.out.println(isNotEmpty.test("Hello")); // Выведет true
System.out.println(isNotEmpty.test("")); // Выведет false


Чтобы явно указать, что интерфейс предназначен для использования как функциональный, используется аннотация @FunctionalInterface. Эта аннотация не обязательна (компилятор может определить функциональный интерфейс и без неё), но она помогает в документировании кода и обеспечивает проверку времени компиляции, гарантируя, что интерфейс содержит только один абстрактный метод.
@FunctionalInterface
public interface SimpleFunction {
int apply(int value);
}

// Использование
SimpleFunction triple = value -> value * 3;
System.out.println(triple.apply(5)); // Выведет 15


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

synchronized (блоки/методы).
- Lock / ReentrantLock.
- volatile (для флагов).
- Atomic переменные.
- Семафоры и барьеры.
- Потокобезопасные коллекции (ConcurrentHashMap, CopyOnWriteArrayList).


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

В интерфейсе могут располагаться различные типы методов, начиная с Java 8, когда в язык были добавлены новые возможности, такие как default методы и static методы. До Java 8 интерфейсы могли содержать только абстрактные методы. Ниже представлены типы методов, которые могут быть объявлены в интерфейсе:

🟠Абстрактные методы
Это методы без тела, предназначенные для переопределения в классах, которые реализуют интерфейс. Абстрактные методы представляют собой контракт, который должен быть выполнен классом-реализатором. Все методы в интерфейсе неявно являются public abstract, даже если явно не указаны эти модификаторы.
void myMethod();


🟠Default методы (начиная с Java 8)
Позволяют определять реализацию метода непосредственно в интерфейсе. Классы, реализующие интерфейс, могут переопределять эти методы, но это не обязательно. Default методы были введены для обеспечения обратной совместимости, позволяя добавлять новые методы в интерфейсы без нарушения существующих реализаций.
default void defaultMethod() {
// Реализация
}


🟠Static методы (начиная с Java 8)
Позволяют определять методы с реализацией, которые могут быть вызваны без создания экземпляра класса, реализующего интерфейс. Эти методы нельзя переопределить в реализующем интерфейс классе.
static void staticMethod() {
// Реализация
}


🟠Private методы (начиная с Java 9)
Позволяют определять вспомогательные методы, которые предназначены для использования в default или static методах внутри того же интерфейса. Эти методы не могут быть вызваны извне интерфейса или реализующих его классов.
private void privateMethod() {
// Реализация
}


Пример
public interface MyInterface {
// Абстрактный метод
void abstractMethod();

// Default метод
default void defaultMethod() {
System.out.println("Default implementation");
}

// Static метод
static void staticMethod() {
System.out.println("Static implementation");
}

// Private метод (используется внутри интерфейса)
private void privateMethod() {
System.out.println("Private helper method");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Зачем нужны и чем отличаются методы encodeURL() и encodeRedirectURL()?

1. encodeURL():
- Используется для кодирования URL, добавляя идентификатор сессии, если cookies отключены.
- Применяется для ссылок, генерируемых на странице.
2. encodeRedirectURL():
- Кодирует URL для использования в sendRedirect.
- Отличается от encodeURL() тем, что специально предназначен для перенаправлений.
Оба метода помогают поддерживать сессии в условиях отсутствия cookies.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Forwarded from easyoffer
🎉 Easyoffer 2.0 — самый успешный краудфандинг в истории рунета в категории "Технологии"!

Мы это сделали! За считанные часы после старта, благодаря вашей поддержке, проект не просто стартовал — он взлетел.

💸 Собрано: 2 276 840 рублей

Это не просто цифра — это ваше доверие, ваша вера в идею, и ваша инвестиция в будущее карьеры сотен (а скоро — тысяч) специалистов.

💼 Благодаря этой сумме мы уже:

— Наняли ещё пару разработчиков и аналитиков
— Запустили активный сбор и разметку новых данных
— Ускорили разработку и подняли планку качества

Спасибо каждому, кто поверил в нас на старте! Дальше — только масштабирование и развитие. Мы строим сервис, который станет must-have для всех, кто ищет работу в IT.

👉 Присоединяйтесь сейчас — это только начало.
💊5
🤔 Для чего нужны функциональные интерфейсы ObjDoubleConsumer<T>, ObjIntConsumer<T> и ObjLongConsumer<T>?

Эти интерфейсы предназначены для выполнения операций над объектом и примитивным значением (double, int, long) без возврата результата.

🚩`ObjDoubleConsumer<T>` – принимает объект + `double`
Используется, когда надо обработать объект + double, но ничего не возвращать.
import java.util.function.ObjDoubleConsumer;

class User {
String name;
double discount;

User(String name) {
this.name = name;
}

void setDiscount(double discount) {
this.discount = discount;
}
}

public class Main {
public static void main(String[] args) {
ObjDoubleConsumer<User> applyDiscount = (user, discount) -> user.setDiscount(discount);

User user = new User("Иван");
applyDiscount.accept(user, 10.5); // Применяем скидку

System.out.println(user.name + " получил скидку " + user.discount + "%");
// Иван получил скидку 10.5%
}
}


🚩`ObjIntConsumer<T>` – принимает объект + `int`

Используется, когда нужно обработать объект и int, но без возврата результата.
import java.util.function.ObjIntConsumer;

class Person {
String name;
int age;

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

void setAge(int age) {
this.age = age;
}
}

public class Main {
public static void main(String[] args) {
ObjIntConsumer<Person> setPersonAge = (person, age) -> person.setAge(age);

Person person = new Person("Анна");
setPersonAge.accept(person, 30); // Устанавливаем возраст

System.out.println(person.name + " теперь " + person.age + " лет");
// Анна теперь 30 лет
}
}


🚩`ObjLongConsumer<T>` – принимает объект + `long`

Используется, когда нужно передать объект + long (например, ID, время) без возврата.
import java.util.function.ObjLongConsumer;

class Account {
String username;
long id;

Account(String username) {
this.username = username;
}

void setId(long id) {
this.id = id;
}
}

public class Main {
public static void main(String[] args) {
ObjLongConsumer<Account> setAccountId = (account, id) -> account.setId(id);

Account account = new Account("user123");
setAccountId.accept(account, 100000L); // Присваиваем ID

System.out.println("Аккаунт " + account.username + " имеет ID " + account.id);
// Аккаунт user123 имеет ID 100000
}
}


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