🤔 Какую из конфигураций, XML, Java Annotation, предпочитаешь больше, почему?
Предпочитаю Java-конфигурацию, потому что:
- Код лучше читается и рефакторится;
- Используются преимущества типизации Java;
- Нет дублирования информации, как в XML.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Предпочитаю Java-конфигурацию, потому что:
- Код лучше читается и рефакторится;
- Используются преимущества типизации Java;
- Нет дублирования информации, как в XML.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1
🤔 Расскажи что такое inversion of Conrol
Inversion of Control (IoC) — это принцип проектирования, при котором управление созданием и жизненным циклом объектов передаётся внешней системе.
🟠Почему нужен IoC?
Без IoC код сильно зависит от конкретных классов, что усложняет тестирование и поддержку.
С IoC (зависимость передаётся извне)
🟠Как реализуется IoC?
IoC достигается через паттерны проектирования, такие как:
Dependency Injection (DI) – передача зависимостей извне (через конструктор, поле или метод).
Factory Method – создание объектов через фабрики.
Event-driven подход – реакция на события вместо явного вызова методов.
🟠IoC в Spring
Spring реализует IoC через контейнер IoC, который управляет созданием объектов (бинов) и их зависимостями.
Ставь 👍 и забирай 📚 Базу знаний
Inversion of Control (IoC) — это принцип проектирования, при котором управление созданием и жизненным циклом объектов передаётся внешней системе.
🟠Почему нужен IoC?
Без IoC код сильно зависит от конкретных классов, что усложняет тестирование и поддержку.
class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // Прямое создание зависимости ❌
}
}С IoC (зависимость передаётся извне)
class Car {
private final Engine engine;
public Car(Engine engine) { // Зависимость передаётся через конструктор
this.engine = engine;
}
}🟠Как реализуется IoC?
IoC достигается через паттерны проектирования, такие как:
Dependency Injection (DI) – передача зависимостей извне (через конструктор, поле или метод).
Factory Method – создание объектов через фабрики.
Event-driven подход – реакция на события вместо явного вызова методов.
🟠IoC в Spring
Spring реализует IoC через контейнер IoC, который управляет созданием объектов (бинов) и их зависимостями.
@Component
class Engine {}
@Component
class Car {
private final Engine engine;
@Autowired
public Car(Engine engine) { // Spring автоматически передаст нужный объект
this.engine = engine;
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Какие есть исключения?
В Java исключения делятся на:
- Проверяемые (Checked) — требуют обработки или объявления:
- IOException, SQLException
- Непроверяемые (Unchecked) — происходят во время выполнения:
- NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException
- Ошибки (Errors) — критические проблемы JVM:
- OutOfMemoryError, StackOverflowError
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
В Java исключения делятся на:
- Проверяемые (Checked) — требуют обработки или объявления:
- IOException, SQLException
- Непроверяемые (Unchecked) — происходят во время выполнения:
- NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException
- Ошибки (Errors) — критические проблемы JVM:
- OutOfMemoryError, StackOverflowError
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8
🤔 Опиши разницу типов данных DATETIME и TIMESTAMP?
В MySQL (и других реляционных БД) типы данных
🚩Когда использовать `DATETIME` и `TIMESTAMP`?
Используйте
Нужно хранить фиксированное значение даты и времени, не зависящее от часового пояса.
Работаете с датами за пределами 1970-2038 гг.
Требуется удобочитаемый формат (без конверсий).
Используйте
Нужно учитывать часовой пояс (например, хранить время в UTC, а при запросе автоматически конвертировать в локальное).
Важно автоматическое обновление при изменении строки (
Нужно экономить память (занимает в 2 раза меньше места, чем
🚩Примеры
DATETIME (Фиксированная дата и время)
TIMESTAMP (Автообновление + Часовые пояса)
Если изменим
Ставь 👍 и забирай 📚 Базу знаний
В MySQL (и других реляционных БД) типы данных
DATETIME и TIMESTAMP используются для хранения даты и времени, но у них есть несколько ключевых отличий. 🚩Когда использовать `DATETIME` и `TIMESTAMP`?
Используйте
DATETIME, если: Нужно хранить фиксированное значение даты и времени, не зависящее от часового пояса.
Работаете с датами за пределами 1970-2038 гг.
Требуется удобочитаемый формат (без конверсий).
Используйте
TIMESTAMP, если: Нужно учитывать часовой пояс (например, хранить время в UTC, а при запросе автоматически конвертировать в локальное).
Важно автоматическое обновление при изменении строки (
ON UPDATE CURRENT_TIMESTAMP). Нужно экономить память (занимает в 2 раза меньше места, чем
DATETIME). 🚩Примеры
DATETIME (Фиксированная дата и время)
CREATE TABLE events (
id INT PRIMARY KEY,
event_time DATETIME NOT NULL
);
INSERT INTO events VALUES (1, '2025-02-17 12:30:00');
TIMESTAMP (Автообновление + Часовые пояса)
CREATE TABLE logs (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Если изменим
time_zone, TIMESTAMP отобразится в новом часовом поясе. SET time_zone = 'Europe/Moscow';
SELECT created_at FROM logs;
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое Spring Scope?
Определяет область видимости бина в контексте Spring.
1. Singleton: один объект создаётся для всего приложения (по умолчанию).
2. Prototype: создаётся новый объект для каждого запроса.
3. Request: бин существует в течение HTTP-запроса.
4. Session: бин живёт в рамках HTTP-сессии.
5. Application: бин существует на уровне всего приложения (сервер-сервлет).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Определяет область видимости бина в контексте Spring.
1. Singleton: один объект создаётся для всего приложения (по умолчанию).
2. Prototype: создаётся новый объект для каждого запроса.
3. Request: бин существует в течение HTTP-запроса.
4. Session: бин живёт в рамках HTTP-сессии.
5. Application: бин существует на уровне всего приложения (сервер-сервлет).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Какие весовые рамки у integer?
В Java тип
-2^{31} \text{ до } 2^{31} - 1
🚩Точный диапазон `int`
🟠Минимальное значение
🟠Максимальное значение
Вывод:
🚩Почему именно такой диапазон?
4 байта (32 бита) означают, что у нас 2³² возможных значений.
Поскольку
Один бит используется для знака (
\text{Диапазон} = - (2^{31}) \text{ до } (2^{31} - 1)
🚩Что будет, если выйти за пределы `int`?
Если сложить два максимальных значения
🟠Как работать с числами больше `int`?
Использовать `long` (8 байт, диапазон от
Использовать
Ставь 👍 и забирай 📚 Базу знаний
В Java тип
int занимает 4 байта (32 бита) и имеет диапазон: -2^{31} \text{ до } 2^{31} - 1
🚩Точный диапазон `int`
🟠Минимальное значение
Integer.MIN_VALUE = -2,147,483,648 🟠Максимальное значение
Integer.MAX_VALUE = 2,147,483,647 public class Main {
public static void main(String[] args) {
System.out.println("Минимальный int: " + Integer.MIN_VALUE);
System.out.println("Максимальный int: " + Integer.MAX_VALUE);
}
}Вывод:
Минимальный int: -2147483648
Максимальный int: 2147483647
🚩Почему именно такой диапазон?
4 байта (32 бита) означают, что у нас 2³² возможных значений.
Поскольку
int знаковый (поддерживает отрицательные и положительные числа), половина значений отводится подотрицательные числа. Один бит используется для знака (
0 – положительное число, 1 – отрицательное). \text{Диапазон} = - (2^{31}) \text{ до } (2^{31} - 1)
🚩Что будет, если выйти за пределы `int`?
Если сложить два максимальных значения
int, произойдёт переполнение (overflow)int a = Integer.MAX_VALUE;
int b = 1;
int c = a + b;
System.out.println(c); // Выведет -2147483648 (переполнение!)
🟠Как работать с числами больше `int`?
Использовать `long` (8 байт, диапазон от
-2^63 до 2^63 - 1): long bigNumber = 2_147_483_648L; // Обязательно добавлять "L" в конце
Использовать
BigInteger (неограниченный размер): BigInteger bigNum = new BigInteger("999999999999999999999999");Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что такое транзакция в БД?
Это последовательность операций с базой данных, которая должна быть выполнена как единое целое.
1. Она удовлетворяет свойствам ACID (атомарность, согласованность, изолированность, надёжность).
2. Если одна из операций не удаётся, транзакция откатывается до начального состояния.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Она удовлетворяет свойствам ACID (атомарность, согласованность, изолированность, надёжность).
2. Если одна из операций не удаётся, транзакция откатывается до начального состояния.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍12
🤔 Расскажи про Hash Code & Equals Contract
Когда вы переопределяете методы
🚩Контракт `equals()`
Метод
Рефлексивность –
Симметричность –
Транзитивность – если
Согласованность – многократные вызовы
Сравнение с
🚩Контракт `hashCode()`
Метод
Если
Если
Хеш-код должен оставаться неизменным, если объект не изменяется.
🚩Почему контракт `equals()` и `hashCode()` важен?
В коллекциях, таких как
Что будет, если
Правильный вариант (
Ставь 👍 и забирай 📚 Базу знаний
Когда вы переопределяете методы
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 всегда false – x.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);
}
}Ставь 👍 и забирай 📚 Базу знаний
👍4💊1
🤔 Что такое One to One?
Это тип связи, при котором каждой записи в одной таблице соответствует ровно одна запись в другой таблице.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это тип связи, при котором каждой записи в одной таблице соответствует ровно одна запись в другой таблице.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8💊1
🤔 Где в обработке исключений может применяться конструкция с finally?
Конструкция
🚩Основная структура
Пример
Ставь 👍 и забирай 📚 Базу знаний
Конструкция
finally в Java используется для гарантированного выполнения кода, независимо от того, произошло исключение или нет. Обычно применяется для освобождения ресурсов, таких как закрытие файлов, соединений с базой данных или потоков. 🚩Основная структура
try {
// Код, который может выбросить исключение
} catch (Exception e) {
// Обработка исключения
} finally {
// Этот блок выполнится всегда
}Пример
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("file.txt");
System.out.println(fileInputStream.read());
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
if (fileInputStream != null) {
fileInputStream.close(); // Всегда закрываем файл
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍8
🤔 Что такое связка try-catch-finally?
Это конструкция для обработки исключений:
- try — блок кода, где может произойти ошибка.
- catch — перехватывает и обрабатывает исключение.
- finally — выполняется всегда, независимо от того, было ли исключение.
finally используется для освобождения ресурсов, закрытия файлов, соединений и т.д.
Особенности класса String?
- Неизменяемый (immutable) — нельзя изменить строку после создания.
- Хранится в String Pool при использовании литералов.
- Имеет переопределённые equals и hashCode, что делает его удобным для коллекций.
- Часто используется и оптимизирован под производительность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- try — блок кода, где может произойти ошибка.
- catch — перехватывает и обрабатывает исключение.
- finally — выполняется всегда, независимо от того, было ли исключение.
finally используется для освобождения ресурсов, закрытия файлов, соединений и т.д.
Особенности класса String?
- Неизменяемый (immutable) — нельзя изменить строку после создания.
- Хранится в String Pool при использовании литералов.
- Имеет переопределённые equals и hashCode, что делает его удобным для коллекций.
- Часто используется и оптимизирован под производительность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8
🤔 Что такое синхронизация и зачем она нужна?
Синхронизация — это механизм, который используется для контроля доступа к общим ресурсам или критическим секциям кода в среде, где несколько потоков или процессов могут одновременно выполняться. Основная цель — обеспечить корректное взаимодействие между потоками, предотвращая одновременное выполнение определённых участков кода, которые могут привести к конфликтам или неконсистентному состоянию данных.
🚩Зачем она нужна
🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.
🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.
🟠Последовательный доступ к ресурсам
Некоторые операции или ресурсы требуют последовательного доступа для предотвращения конфликтов или некорректной работы. Например, запись в файл или обновление базы данных должны выполняться последовательно, чтобы избежать наложения данных или повреждения структуры данных.
🚩Как она реализуется
🟠Ключевое слово
Может использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.
🟠Явные блокировки с использованием классов из пакета
Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.
🟠Волатильные переменные (
Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.
Ставь 👍 и забирай 📚 Базу знаний
Синхронизация — это механизм, который используется для контроля доступа к общим ресурсам или критическим секциям кода в среде, где несколько потоков или процессов могут одновременно выполняться. Основная цель — обеспечить корректное взаимодействие между потоками, предотвращая одновременное выполнение определённых участков кода, которые могут привести к конфликтам или неконсистентному состоянию данных.
🚩Зачем она нужна
🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.
🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.
🟠Последовательный доступ к ресурсам
Некоторые операции или ресурсы требуют последовательного доступа для предотвращения конфликтов или некорректной работы. Например, запись в файл или обновление базы данных должны выполняться последовательно, чтобы избежать наложения данных или повреждения структуры данных.
🚩Как она реализуется
🟠Ключевое слово
synchronizedМожет использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.
🟠Явные блокировки с использованием классов из пакета
java.util.concurrent.locksПредоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.
🟠Волатильные переменные (
volatile)Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Как осуществляется вставка значений в HashMap?
1. Вычисляется hashCode() ключа.
2. Определяется индекс бакета.
3. Если бакет пуст — вставка.
4. Если есть коллизии — сравнение через equals(), цепочка или дерево.
5. При превышении порога — расширение массива.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Вычисляется hashCode() ключа.
2. Определяется индекс бакета.
3. Если бакет пуст — вставка.
4. Если есть коллизии — сравнение через equals(), цепочка или дерево.
5. При превышении порога — расширение массива.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥3
🤔 Как устроена память JVM?
JVM (Java Virtual Machine) управляет памятью приложения и делит её на несколько областей.
🟠Heap (Куча) – область для объектов
Здесь хранятся ВСЕ объекты и массивы, созданные через
Управляется Garbage Collector (GC)
🟠Stack (Стек) – область для методов и переменных
Локальные переменные (
Ссылки на объекты в
Вызовы методов (кадры стека)
🟠Metaspace – метаданные классов
Хранит информацию о загруженных классах (названия, методы, поля, байт-код).
При загрузке нового класса
В Java 8 заменил устаревший
🟠Program Counter (PC Register)
Хранит адрес текущей инструкции, выполняемой потоком.
У каждого потока свой PC Register.
Работает как указатель в машинном коде.
🟠Native Method Stack
Хранит данные, связанные с вызовами нативных методов (
Если Java вызывает C++-код, информация о вызове хранится здесь.
Ставь 👍 и забирай 📚 Базу знаний
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();
}Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое конструктор для копирования?
Конструктор копирования — это специальный конструктор, который:
- Создаёт новый объект, копируя поля из другого объекта того же класса.
- Позволяет реализовать глубокое или поверхностное копирование.
Пример: User(User other) — копирует поля из other в новый экземпляр.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Конструктор копирования — это специальный конструктор, который:
- Создаёт новый объект, копируя поля из другого объекта того же класса.
- Позволяет реализовать глубокое или поверхностное копирование.
Пример: User(User other) — копирует поля из other в новый экземпляр.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥2💊2
🤔 Является ли коллекция HashMap потоком безопасной?
Коллекция
🟠
Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
🟠
Предоставляет потокобезопасную реализацию карты без блокировки всей карты.
Ставь 👍 и забирай 📚 Базу знаний
Коллекция
HashMap не является потокобезопасной. Это означает, что при одновременном доступе к нему из нескольких потоков без должной синхронизации могут возникнуть проблемы, такие как потеря данных, гонки за данные и другие виды состояний гонки. Если один поток изменяет ее структуру (например, добавляя или удаляя элементы), в то время как другой поток итерирует по ней или также пытается внести изменения, результаты могут быть непредсказуемыми.🟠
Collections.synchronizedMap(Map)Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
🟠
ConcurrentHashMapПредоставляет потокобезопасную реализацию карты без блокировки всей карты.
ConcurrentHashMap разработан для высокой конкуренции и эффективности при доступе из множества потоков, обеспечивая лучшую производительность по сравнению с synchronizedMap. ConcurrentHashMap позволяет одновременно читать данные из карты несколькими потоками без блокировки и записывать данные при минимальной блокировке.Map<String, String> concurrentMap = new ConcurrentHashMap<>();
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что понимается под контекстом ошибки?
Контекст — это сопутствующая информация: значения переменных, условия, внешние события, окружение. Она помогает воспроизвести и устранить проблему быстрее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Контекст — это сопутствующая информация: значения переменных, условия, внешние события, окружение. Она помогает воспроизвести и устранить проблему быстрее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥3👍1
🤔 Обеспечит ли Stream API RandomAcess?
Нет, Stream API не поддерживает
🚩Почему Stream API не поддерживает `RandomAccess`?
🟠Stream – это поток данных
который не обязательно хранится в памяти в виде структуры, поддерживающей случайный доступ.
🟠Нет индексов
в отличие от
🟠Обход последовательный
элементы проходятся один за другим, что делает случайный доступ невозможным.
Ставь 👍 и забирай 📚 Базу знаний
Нет, Stream API не поддерживает
RandomAccess, потому что он работает с потоком данных, а не с индексированными структурами. 🚩Почему Stream API не поддерживает `RandomAccess`?
🟠Stream – это поток данных
который не обязательно хранится в памяти в виде структуры, поддерживающей случайный доступ.
🟠Нет индексов
в отличие от
List, Stream не позволяет получить элемент по индексу (get(index) отсутствует). 🟠Обход последовательный
элементы проходятся один за другим, что делает случайный доступ невозможным.
List (с RandomAccess)List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
System.out.println(list.get(2)); // Быстрое получение элемента по индексу
Stream (без RandomAccess)Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.skip(2).findFirst().ifPresent(System.out::println); // Ищем 3-й элемент
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Объясни смысл параметров в конструкторе HashMap(int initialCapacity, float loadFactor).
- initialCapacity — начальное количество корзин;
- loadFactor — коэффициент загрузки: если заполнено более capacity × loadFactor, будет расширение.
Например, new HashMap<>(16, 0.75f) означает, что при достижении 12 элементов произойдёт расширение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- initialCapacity — начальное количество корзин;
- loadFactor — коэффициент загрузки: если заполнено более capacity × loadFactor, будет расширение.
Например, new HashMap<>(16, 0.75f) означает, что при достижении 12 элементов произойдёт расширение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥1
🤔 В чем разница между шаблоном проектирования Builder и Facade?
🚩`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 метод
Ставь 👍 и забирай 📚 Базу знаний
👍6