Java | Вопросы собесов
11.5K subscribers
33 photos
2 videos
1.27K links
Download Telegram
🤔 Какая величина у байта?

Байт равен 8 битам и является базовой единицей измерения данных в памяти.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊19👍18🔥1
🤔 Какие типы данных есть в контексте JVM?

В контексте JVM (Java Virtual Machine) типы данных делятся на два основных класса: примитивные типы данных и ссылочные типы данных.

🚩Примитивные типы данных

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

🟠Числовые типы
Целочисленные типы
byte: 8-битный знаковый целочисленный тип данных (диапазон от -128 до 127).
short: 16-битный знаковый целочисленный тип данных (диапазон от -32,768 до 32,767).
int: 32-битный знаковый целочисленный тип данных (диапазон от -2^31 до 2^31-1).
long: 64-битный знаковый целочисленный тип данных (диапазон от -2^63 до 2^63-1).
Типы с плавающей точкой
float: 32-битный IEEE 754 тип данных с плавающей точкой одинарной точности.
double: 64-битный IEEE 754 тип данных с плавающей точкой двойной точности.

🟠Логический тип
boolean: Представляет логическое значение (true или false).

🟠Символьный тип
char: 16-битный тип данных, представляющий символ Unicode (диапазон от '\u0000' до '\uffff').

🚩Ссылочные типы данных

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

🟠Классы (Classes)
Любой объектный тип данных является экземпляром класса. Классы могут быть как стандартными (например, String, Integer), так и пользовательскими.
🟠Интерфейсы (Interfaces)
Интерфейсы определяют набор методов, которые должны быть реализованы классами, которые их реализуют.
🟠Массивы (Arrays)
Массивы могут быть одномерными или многомерными и могут хранить как примитивные, так и ссылочные типы данных.

🚩Пример примитивных и ссылочных типов данных

public class DataTypesExample {
public static void main(String[] args) {
// Примитивные типы данных
byte aByte = 10;
short aShort = 100;
int anInt = 1000;
long aLong = 10000L;
float aFloat = 10.5f;
double aDouble = 10.55;
boolean aBoolean = true;
char aChar = 'A';

// Ссылочные типы данных
String aString = "Hello, World!";
Integer anInteger = 1000;
int[] anArray = {1, 2, 3, 4, 5};

// Вывод примитивных типов данных
System.out.println("byte: " + aByte);
System.out.println("short: " + aShort);
System.out.println("int: " + anInt);
System.out.println("long: " + aLong);
System.out.println("float: " + aFloat);
System.out.println("double: " + aDouble);
System.out.println("boolean: " + aBoolean);
System.out.println("char: " + aChar);

// Вывод ссылочных типов данных
System.out.println("String: " + aString);
System.out.println("Integer: " + anInteger);
System.out.println("Array: " + java.util.Arrays.toString(anArray));
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍8
🤔 Как используется SOLID принцип открытости-закрытости при проектировании?

Принцип открытости-закрытости (Open-Closed Principle) предполагает, что программные сущности должны быть открыты для расширения, но закрыты для модификации. Это достигается через использование абстракций, интерфейсов и наследования.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍12
🤔 Расскажи про Hash Code & Equals Contract

Когда вы переопределяете методы equals() и hashCode(), важно соблюдать контракт, иначе объект может вести себя некорректно в коллекциях (HashMap, HashSet и др.).

🚩Контракт `equals()`

Метод equals() определяет, когда два объекта равны.
Рефлексивность – x.equals(x) всегда true.
Симметричность – x.equals(y) == y.equals(x).
Транзитивность – если x.equals(y) и y.equals(z), то x.equals(z).
Согласованность – многократные вызовы x.equals(y) дают один и тот же результат.
Сравнение с null всегда falsex.equals(null) == false.
class Person {
private String name;
private int age;

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

@Override
public boolean equals(Object obj) {
if (this == obj) return true; // Проверка на одинаковые ссылки
if (obj == null || getClass() != obj.getClass()) return false; // Проверка типа
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // Сравнение полей
}
}


🚩Контракт `hashCode()`

Метод hashCode() возвращает числовой хеш-код объекта. Он должен соответствовать equals()!
Если x.equals(y) == true, то x.hashCode() == y.hashCode().
Если x.hashCode() != y.hashCode(), то x.equals(y) == false (но обратное не всегда верно).
Хеш-код должен оставаться неизменным, если объект не изменяется.
@Override
public int hashCode() {
return Objects.hash(name, age);
}


🚩Почему контракт `equals()` и `hashCode()` важен?

В коллекциях, таких как HashSet, HashMap, HashTable, объекты хранятся по хеш-коду.
Что будет, если equals() переопределён, но hashCode() – нет?
Set<Person> people = new HashSet<>();
people.add(new Person("Иван", 25));
people.add(new Person("Иван", 25)); // Ожидаем, что не добавится

System.out.println(people.size()); // Будет 2, а не 1, если `hashCode()` отсутствует!


Правильный вариант (equals() + hashCode())
class Person {
private String name;
private int age;

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

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

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍6🤔2
🤔 В чём разница между Dependency Injection и инверсией управления?

Inversion of Control (IoC) — это общая концепция, при которой внешняя система управляет созданием и связыванием объектов.
Dependency Injection (DI) — это конкретный способ реализации IoC, при котором зависимости:
- внедряются в объект через:
- конструктор;
- поле;
- метод.
Иными словами:
- IoC — это философия.
- DI — это инструмент.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍13🔥6
🤔 Чем отличается компонент от бина?

В 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);


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Чем отличается композиция от наследования?

- Наследование — это отношение "является", позволяет использовать поведение родительского класса.
- Композиция — это отношение "имеет", позволяет встраивать поведение других объектов и менять их без изменения иерархии. Композиция более гибкая и предпочтительна при проектировании.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4🔥1💊1
🤔 Чем отличаются методы 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
...


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Request мы можем использовать во всех Spring приложениях?

Нет. Объект HttpServletRequest и скоуп request доступны только в веб-приложениях на Spring MVC или Spring Boot.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍7
🤔 Что должно быть если объект equals нал?

Метод equals() в Java предназначен для проверки равенства двух объектов. Если объект, переданный в метод equals(), равен null, метод должен возвращать `false`, так как объект не может быть равен null по определению. Рассмотрим этот случай более подробно.

🚩Почему важно обрабатывать `null` в `equals()`?

🟠Контракт метода `equals()`
Согласно спецификации Java, метод equals() должен возвращать false, если объект, переданный в метод, равен null. Это необходимо для корректного сравнения объектов.
Симметричность: Если a.equals(b) возвращает true, то b.equals(a) также должно возвращать true.
Для null: Вызов x.equals(null) всегда должен возвращать false.

🟠Предотвращение `NullPointerException`
Если метод equals() не проверяет, является ли объект null, попытка доступа к его полям или методам вызовет NullPointerException.

🚩Как правильно реализовать метод `equals()`?

Вот стандартный способ реализации метода equals()
@Override
public boolean equals(Object obj) {
// Проверяем, равен ли объект null
if (obj == null) {
return false;
}

// Проверяем, является ли объект тем же самым
if (this == obj) {
return true;
}

// Проверяем, принадлежит ли объект тому же классу
if (getClass() != obj.getClass()) {
return false;
}

// Приводим объект к текущему типу
MyClass other = (MyClass) obj;

// Сравниваем необходимые поля
return this.field.equals(other.field);
}


🚩Что происходит, если игнорировать проверку `null`?

Если вы не проверяете null, код вроде следующего приведет к ошибке
MyClass obj1 = new MyClass("Hello");
MyClass obj2 = null;

System.out.println(obj1.equals(obj2)); // Если нет проверки null -> NullPointerException


Пример с проверкой null
class MyClass {
private String value;

public MyClass(String value) {
this.value = value;
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
MyClass other = (MyClass) obj;
return value.equals(other.value);
}
}

public class Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass("Hello");
MyClass obj2 = null;

System.out.println(obj1.equals(obj2)); // false
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍2