🤔 В чем разница между Spring аннотациями Component, Repository и Service?
Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.
🚩`@Component` – базовая аннотация для бина
Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
🚩`@Service` – для бизнес-логики
Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
🚩`@Repository` – для работы с базой данных
Автоматически перехватывает SQL-исключения (
Ставь 👍 и забирай 📚 Базу знаний
Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.
🚩`@Component` – базовая аннотация для бина
@Component помечает класс как Spring-бин (компонент). Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
@Component
public class MyComponent {
public void doWork() {
System.out.println("Работа компонента");
}
}
🚩`@Service` – для бизнес-логики
@Service – это специализированный @Component, используемый для сервисных классов (логика приложения). Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
@Service
public class UserService {
public String getUser() {
return "Пользователь Иван";
}
}
🚩`@Repository` – для работы с базой данных
@Repository – это специализированный @Component для слоя доступа к данным (DAO, Repository). Автоматически перехватывает SQL-исключения (
PersistenceExceptionTranslationPostProcessor) и преобразует их в DataAccessException. @Repository
public class UserRepository {
public String findUserById(int id) {
return "Пользователь с ID " + id;
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍15
🤔 Что такое кеширование?
Кеширование — это временное хранение данных в более быстром доступе, чтобы:
- Уменьшить нагрузку на систему или БД.
- Повысить производительность.
- Сократить задержки при повторном использовании одинаковых данных.
Кеш может быть в памяти (например, Map, Redis), в браузере или на уровне CDN.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Кеширование — это временное хранение данных в более быстром доступе, чтобы:
- Уменьшить нагрузку на систему или БД.
- Повысить производительность.
- Сократить задержки при повторном использовании одинаковых данных.
Кеш может быть в памяти (например, Map, Redis), в браузере или на уровне CDN.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍11
🤔 Обеспечит ли 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-й элемент
Ставь 👍 и забирай 📚 Базу знаний
👍3
Каналы с Junior IT вакансиями
и стажировками
Подписывайся и забирай свой оффер
1. Стажировки и вакансии по России и миру
2. IT вакансии по СНГ
3. IT стажировки по СНГ
4. ИИ-ассистент для автооткликов
5. DIGITAL и IT стажировки и вакансии
6. IT стажировки в топовых компаниях мира
7. Удалённые IT вакансии и стажировки
8. Python вакансии и стажировки
9. БИГТЕХ вакансии и стажировки
10. Design вакансии и стажировки
11. QA вакансии и стажировки
12. Junior вакансии и стажировки
13. Frontend вакансии и вопросы собесов
14. Вакансии и стажировки для аналитиков
15. Вакансии в русских стартапах за границей
16. Вакансии и стажировки для DevOps
17. Вакансии, которых нет на ХХ.РУ
Please open Telegram to view this post
VIEW IN TELEGRAM
FRONTENDFRONTENDFRONTENDFRONTENDFRONTENDFRONTENDFRONTEND
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊39🤔25🔥2👍1
🤔 Является ли пустым пул строк при старте jar файла или там есть какие-то значения?
Пул строк в Java не является пустым при старте JAR файла. Он изначально содержит несколько предопределенных строковых литералов, которые JVM использует для своей внутренней работы, а также строковые литералы, используемые в загруженных классах и стандартных библиотеках.
🚩Что изначально содержится
🟠Предопределенные строковые литералы
JVM и стандартные библиотеки Java используют различные строковые литералы для своей работы. Эти строки добавляются в пул строк при запуске JVM. Примеры таких строк включают имена основных классов и пакетов (например,
🟠Строковые литералы, используемые в загруженных классах
Когда классы загружаются JVM, все строковые литералы, используемые в этих классах, добавляются в пул строк. Это включает строки, используемые в JAR файле, а также строки из стандартных библиотек Java, которые загружаются при старте.
🚩Пример строк в пуле при старте
Для демонстрации этого можно написать простой код, который проверяет, присутствуют ли определенные строки в пуле строк при старте программы.
🚩Что происходит при старте JVM
🟠Инициализация JVM
При запуске JVM загружаются системные классы, такие как
🟠Загрузка пользовательских классов
Когда JVM загружает пользовательские классы из JAR файла, все строковые литералы в этих классах также добавляются в пул строк.
Ставь 👍 и забирай 📚 Базу знаний
Пул строк в Java не является пустым при старте JAR файла. Он изначально содержит несколько предопределенных строковых литералов, которые JVM использует для своей внутренней работы, а также строковые литералы, используемые в загруженных классах и стандартных библиотеках.
🚩Что изначально содержится
🟠Предопределенные строковые литералы
JVM и стандартные библиотеки Java используют различные строковые литералы для своей работы. Эти строки добавляются в пул строк при запуске JVM. Примеры таких строк включают имена основных классов и пакетов (например,
"java/lang/Object", "java/lang/String").🟠Строковые литералы, используемые в загруженных классах
Когда классы загружаются JVM, все строковые литералы, используемые в этих классах, добавляются в пул строк. Это включает строки, используемые в JAR файле, а также строки из стандартных библиотек Java, которые загружаются при старте.
🚩Пример строк в пуле при старте
Для демонстрации этого можно написать простой код, который проверяет, присутствуют ли определенные строки в пуле строк при старте программы.
public class StringPoolDemo {
public static void main(String[] args) {
// Проверка стандартных строк, которые могут быть в пуле строк
String str1 = "java";
String str2 = "lang";
String str3 = "Object";
// Вывод строк
System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
System.out.println("str3: " + str3);
// Проверка строк в пуле строк
System.out.println("Is 'java' in pool: " + (str1 == "java"));
System.out.println("Is 'lang' in pool: " + (str2 == "lang"));
System.out.println("Is 'Object' in pool: " + (str3 == "Object"));
}
}🚩Что происходит при старте JVM
🟠Инициализация JVM
При запуске JVM загружаются системные классы, такие как
java.lang.Object, java.lang.String, java.lang.System, и другие. Строковые литералы, используемые в этих классах, добавляются в пул строк.🟠Загрузка пользовательских классов
Когда JVM загружает пользовательские классы из JAR файла, все строковые литералы в этих классах также добавляются в пул строк.
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Как найти ошибку в программе?
- использовать логирование;
- запускать в отладчике (debugger);
- добавлять assert’ы;
- анализировать стектрейс и исключения;
- использовать тесты и изоляцию кода для проверки.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- использовать логирование;
- запускать в отладчике (debugger);
- добавлять assert’ы;
- анализировать стектрейс и исключения;
- использовать тесты и изоляцию кода для проверки.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Что такое heap, stack?
В контексте Java, Heap (куча) и Stack (стек) являются областями памяти, используемыми JVM для управления памятью, необходимой для выполнения программы. Каждая из этих областей имеет свои характеристики и используется для разных целей.
🚩Heap (Куча)
Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора
🟠Особенности
Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation).
Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1).
Старое поколение хранит долгоживущие объекты.
🟠Управление памятью
Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются.
🟠Использование
Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.
🚩Stack (Стек)
Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах.
🟠Особенности
Каждый поток имеет свой собственный стек.
Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах.
🟠Управление памятью
Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека.
🟠Использование
Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче.
Локальные переменные методов и параметры методов хранятся в стеке.
Ставь 👍 и забирай 📚 Базу знаний
В контексте 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 хранится в стеке
}
}Ставь 👍 и забирай 📚 Базу знаний
🔥5👍1
🤔 Оцени количество памяти на хранение одного примитива типа byte в LinkedList.
В LinkedList<byte>:
- каждый элемент обёрнут в Byte (объект), т.е. автобоксинг;
- на один узел выделяется память под Byte, ссылки prev, next, и сам Node-объект.
Суммарно: 40–56 байт в зависимости от JVM и архитектуры (64-бит без/с компрессией указателей).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
В LinkedList<byte>:
- каждый элемент обёрнут в Byte (объект), т.е. автобоксинг;
- на один узел выделяется память под Byte, ссылки prev, next, и сам Node-объект.
Суммарно: 40–56 байт в зависимости от JVM и архитектуры (64-бит без/с компрессией указателей).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥17
🤔 Что знаешь про поверхностное копирование?
Поверхностное копирование (Shallow Copy) – это процесс создания нового объекта, который содержит ссылки на те же вложенные объекты, что и оригинал.
🟠Как сделать поверхностное копирование в Java?
Способ 1: Метод
🟠Проблема с вложенными объектами (общие ссылки)
Если объект содержит вложенные объекты, они не копируются, а передаются по ссылке.
🟠Как сделать глубокую копию? (Deep Copy)
Решение: Создать новый вложенный объект в
Ставь 👍 и забирай 📚 Базу знаний
Поверхностное копирование (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;
}
Ставь 👍 и забирай 📚 Базу знаний
👍6🤔1
🤔 В чем разница между RequestMapping и PutMapping?
-@RequestMapping (method = RequestMethod.PUT) — общий способ задания обработки PUT-запроса;
- @PutMapping — специализированная аннотация, сокращающий способ записи для PUT-запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
-
-
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 В чем разница между new string и string?
В Java строки (
🚩`"Hello"` — строка из пула строк
Когда вы пишете:
🚩`new String("Hello")` — создание нового объекта
Когда вы создаёте строку так:
🚩Разница в сравнении строк
🚩Когда использовать `new String()`?
В 99% случаев
Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
Ставь 👍 и забирай 📚 Базу знаний
В Java строки (
String) являются неизменяемыми (immutable) объектами и обрабатываются особым образом, особенно при их создании.🚩`"Hello"` — строка из пула строк
Когда вы пишете:
String str1 = "Hello";
🚩`new String("Hello")` — создание нового объекта
Когда вы создаёте строку так:
String str2 = new String("Hello");🚩Разница в сравнении строк
public class StringTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true (ссылаются на один объект в пуле)
System.out.println(str1 == str3); // false (разные объекты в памяти)
System.out.println(str1.equals(str3)); // true (содержимое одинаковое)
}
}🚩Когда использовать `new String()`?
В 99% случаев
new String() не нужен. Его создание расходует память и снижает производительность.Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
String safeCopy = new String(originalString); // Теперь это точно отдельный объект
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое ленивая загрузка?
Ленивая загрузка (Lazy Loading) — это паттерн, при котором объект или данные загружаются только тогда, когда они реально понадобились, а не заранее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ленивая загрузка (Lazy Loading) — это паттерн, при котором объект или данные загружаются только тогда, когда они реально понадобились, а не заранее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍17
🤔 Что такое Commit в SQL?
Простой пример использования
Что будет, если НЕ выполнить
Ставь 👍 и забирай 📚 Базу знаний
COMMIT – это команда в SQL, которая фиксирует (сохраняет) изменения, сделанные внутри транзакции. После выполнения COMMIT изменения становятся постоянными и их уже нельзя отменить. Простой пример использования
COMMITBEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- Сохраняем изменения
Что будет, если НЕ выполнить
COMMIT? BEGIN TRANSACTION;
UPDATE users SET age = 30 WHERE id = 1;
COMMIT vs ROLLBACK BEGIN TRANSACTION;
UPDATE orders SET status = 'CANCELLED' WHERE id = 10;
ROLLBACK; -- ОТМЕНЯЕМ изменения, данные не меняются
Ставь 👍 и забирай 📚 Базу знаний
👍6💊2
🤔 Что такое jjs?
Это CLI-инструмент, использующий движок Nashorn. Позволяет запускать JS-скрипты на JVM прямо из терминала.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это CLI-инструмент, использующий движок Nashorn. Позволяет запускать JS-скрипты на JVM прямо из терминала.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊15🔥8
🤔 Что такое синхронизация и зачем она нужна?
Синхронизация — это механизм, который используется для контроля доступа к общим ресурсам или критическим секциям кода в среде, где несколько потоков или процессов могут одновременно выполняться. Основная цель — обеспечить корректное взаимодействие между потоками, предотвращая одновременное выполнение определённых участков кода, которые могут привести к конфликтам или неконсистентному состоянию данных.
🚩Зачем она нужна
🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.
🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.
🟠Последовательный доступ к ресурсам
Некоторые операции или ресурсы требуют последовательного доступа для предотвращения конфликтов или некорректной работы. Например, запись в файл или обновление базы данных должны выполняться последовательно, чтобы избежать наложения данных или повреждения структуры данных.
🚩Как она реализуется
🟠Ключевое слово
Может использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.
🟠Явные блокировки с использованием классов из пакета
Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.
🟠Волатильные переменные (
Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.
Ставь 👍 и забирай 📚 Базу знаний
Синхронизация — это механизм, который используется для контроля доступа к общим ресурсам или критическим секциям кода в среде, где несколько потоков или процессов могут одновременно выполняться. Основная цель — обеспечить корректное взаимодействие между потоками, предотвращая одновременное выполнение определённых участков кода, которые могут привести к конфликтам или неконсистентному состоянию данных.
🚩Зачем она нужна
🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.
🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.
🟠Последовательный доступ к ресурсам
Некоторые операции или ресурсы требуют последовательного доступа для предотвращения конфликтов или некорректной работы. Например, запись в файл или обновление базы данных должны выполняться последовательно, чтобы избежать наложения данных или повреждения структуры данных.
🚩Как она реализуется
🟠Ключевое слово
synchronizedМожет использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.
🟠Явные блокировки с использованием классов из пакета
java.util.concurrent.locksПредоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.
🟠Волатильные переменные (
volatile)Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Предложи эффективный алгоритм удаления нескольких рядом стоящих элементов из середины ArrayList.
- Использовать метод removeRange(start, end) — но он protected;
- Альтернатива: использовать subList(start, end).clear() — это эффективно, т.к. одна операция и не вызывает поэлементное удаление.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Использовать метод removeRange(start, end) — но он protected;
- Альтернатива: использовать subList(start, end).clear() — это эффективно, т.к. одна операция и не вызывает поэлементное удаление.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥13
🤔 Что такое адаптер?
Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.
🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс
Старый интерфейс (неподходящий)
Новый интерфейс (нужный)
Адаптер, который превращает
Использование адаптера
Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (
Ставь 👍 и забирай 📚 Базу знаний
Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.
🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс
OldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V). Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}Адаптер, который превращает
220V в 5Vclass ChargerAdapter implements USBCharger {
private OldCharger oldCharger;
public ChargerAdapter(OldCharger oldCharger) {
this.oldCharger = oldCharger;
}
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
oldCharger.charge220V();
}
}Использование адаптера
public class Main {
public static void main(String[] args) {
OldCharger oldCharger = new OldCharger();
USBCharger adapter = new ChargerAdapter(oldCharger);
adapter.charge5V(); // Теперь старая зарядка работает с 5V!
}
}Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (
extends). class ChargerAdapter extends OldCharger implements USBCharger {
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
charge220V();
}
}Ставь 👍 и забирай 📚 Базу знаний
👍10
🤔 Чем rebase отличается от merge?
1. Rebase переносит изменения текущей ветки на базу другой ветки, перезаписывая историю коммитов.
2. Merge объединяет изменения двух веток, создавая дополнительный коммит слияния.
3. Rebase делает историю линейной и чистой, но может быть сложен для командной работы .
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
2. Merge объединяет изменения двух веток, создавая дополнительный коммит слияния.
3. Rebase делает историю линейной и чистой, но может быть сложен для командной работы
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥7🤔3
🤔 Какие Fetching Types знаешь в Hibernate и чем они отличаются?
В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.
🚩Lazy Fetching (ленивая загрузка)
Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в
🚩Eager Fetching (жадная загрузка)
Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает
Используется по умолчанию в
Ставь 👍 и забирай 📚 Базу знаний
В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.
🚩Lazy Fetching (ленивая загрузка)
Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в
@OneToMany, @ManyToMany. @Entity
class User {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders; // Загрузятся ТОЛЬКО при первом вызове getOrders()
}
User user = session.get(User.class, 1L); // Загружается только User
List<Order> orders = user.getOrders(); // Запрос в БД выполняется ТОЛЬКО здесь
🚩Eager Fetching (жадная загрузка)
Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает
JOIN или несколько отдельных запросов. Используется по умолчанию в
@ManyToOne, @OneToOne. @Entity
class User {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Order> orders; // Загружается сразу при получении User
}
User user = session.get(User.class, 1L); // Загружается User + сразу все его Orders
Ставь 👍 и забирай 📚 Базу знаний
👍5