🤔 В чем разница JPQL и HQL?
JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) – это языки запросов, похожие на SQL, но работающие с объектами, а не с таблицами БД.
Главное отличие: JPQL – стандарт JPA, а HQL – специфичен для Hibernate.
🚩JPQL (Java Persistence Query Language)
Стандартный язык JPA, работает со всеми JPA-совместимыми провайдерами (
Опирается на JPA Entity-классы, а не на реальные таблицы в БД.
🚩HQL (Hibernate Query Language)
Язык запросов специфичный для Hibernate.
Работает аналогично JPQL, но поддерживает дополнительные возможности, например, вызов методов и фильтрацию по подзапросам.
Ставь 👍 и забирай 📚 Базу знаний
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();
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Для чего используется WeakHashMap?
Хранит ключи через слабые ссылки, чтобы:
- позволить сборку мусора, если на ключ больше нет сильных ссылок;
- удобно при кэшировании, где важен автоматический сброс.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Хранит ключи через слабые ссылки, чтобы:
- позволить сборку мусора, если на ключ больше нет сильных ссылок;
- удобно при кэшировании, где важен автоматический сброс.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥7👍4
🤔 Что знаешь об интерфейсе FileFilter?
🚩Как работает `FileFilter`?
Этот интерфейс содержит всего один метод:
🚩Пример использования `FileFilter`
Допустим, мы хотим отфильтровать все файлы
Выходные данные (если в папке
🚩Lambda-версия (Java 8+)
Вместо анонимного класса можно использовать лямбда-выражение:
🚩Разница между `FileFilter` и `FilenameFilter`
Ставь 👍 и забирай 📚 Базу знаний
FileFilter — это интерфейс в пакете java.io, используемый для фильтрации файлов в каталогах. Он применяется в методе listFiles(FileFilter filter) класса File и позволяет выбрать только те файлы, которые соответствуют заданным критериям.🚩Как работает `FileFilter`?
Этот интерфейс содержит всего один метод:
boolean accept(File pathname);
🚩Пример использования `FileFilter`
Допустим, мы хотим отфильтровать все файлы
.txt в заданной папке:import java.io.File;
import java.io.FileFilter;
public class TxtFileFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example"); // Укажите свою папку
// Используем FileFilter для выбора файлов с расширением .txt
FileFilter txtFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.getName().endsWith(".txt");
}
};
// Получаем список файлов, соответствующих фильтру
File[] txtFiles = directory.listFiles(txtFilter);
// Выводим найденные файлы
if (txtFiles != null) {
for (File file : txtFiles) {
System.out.println("Файл: " + file.getName());
}
}
}
}
Выходные данные (если в папке
C:/example есть файлы .txt)Файл: notes.txt
Файл: tasks.txt
🚩Lambda-версия (Java 8+)
Вместо анонимного класса можно использовать лямбда-выражение:
FileFilter txtFilter = file -> file.isFile() && file.getName().endsWith(".txt");🚩Разница между `FileFilter` и `FilenameFilter`
FileFilter принимает объект File, позволяя фильтровать как файлы, так и каталоги.FilenameFilter принимает только имя файла (без пути).import java.io.File;
import java.io.FilenameFilter;
public class TxtFilenameFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example");
// Фильтр для файлов .txt
FilenameFilter txtFilter = (dir, name) -> name.endsWith(".txt");
String[] txtFiles = directory.list(txtFilter);
if (txtFiles != null) {
for (String file : txtFiles) {
System.out.println("Файл: " + file);
}
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Что такое mock в тестировании?
Это имитация объекта для тестирования.
1. Используется, чтобы изолировать тестируемый код от зависимостей.
2. Помогает проверить поведение системы в различных сценариях без реального взаимодействия.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Используется, чтобы изолировать тестируемый код от зависимостей.
2. Помогает проверить поведение системы в различных сценариях без реального взаимодействия.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 В чем разница между Statement и PreparedStatement?
Это два интерфейса в JDBC, которые используются для выполнения SQL-запросов к базе данных. Основные различия между ними касаются производительности, безопасности и удобства использования.
🚩Statement
Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
🟠PreparedStatement
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
🚩Основные различия
🟠Производительность
🟠Безопасность
🟠Удобство использования
🟠Типы запросов
Оба интерфейса могут выполнять запросы типа
Ставь 👍 и забирай 📚 Базу знаний
Это два интерфейса в JDBC, которые используются для выполнения SQL-запросов к базе данных. Основные различия между ними касаются производительности, безопасности и удобства использования.
🚩Statement
Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
Statement stmt = connection.createStatement();
String query = "SELECT * FROM employees WHERE department = 'HR'";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
stmt.close();
🟠PreparedStatement
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
String query = "SELECT * FROM employees WHERE department = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, "HR");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
pstmt.close();
🚩Основные различия
🟠Производительность
Statement: Каждый запрос компилируется заново, что снижает производительность при многократном выполнении одного и того же запроса.PreparedStatement: Запрос компилируется один раз и может многократно выполняться с разными параметрами, что повышает производительность.🟠Безопасность
Statement: Уязвим к SQL-инъекциям, поскольку запросы формируются путем конкатенации строк.PreparedStatement: Использует параметризованные запросы, что защищает от SQL-инъекций.🟠Удобство использования
Statement: Подходит для простых, одноразовых запросов.PreparedStatement: Удобен для многократного выполнения запросов с разными параметрами.🟠Типы запросов
Оба интерфейса могут выполнять запросы типа
SELECT, INSERT, UPDATE, DELETE, но PreparedStatement более удобен для запросов с параметрами.Ставь 👍 и забирай 📚 Базу знаний
👍11
🤔 Какие есть механизмы для сложных запросов с множеством параметров?
В Spring и Hibernate можно использовать:
- JPQL — объектно-ориентированный SQL.
- Native SQL — для сложных или нестандартных запросов.
- Criteria API — программно-строимые типобезопасные запросы.
- Specification — шаблон для построения динамических запросов с множеством условий.
- @Query — аннотация в Spring Data для написания запросов прямо в интерфейсе репозитория.
- QueryDSL — внешняя библиотека, генерирующая типобезопасные запросы.
Все эти подходы позволяют создавать гибкие, читаемые и поддерживаемые SQL-запросы даже с десятками параметров и условий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- JPQL — объектно-ориентированный SQL.
- Native SQL — для сложных или нестандартных запросов.
- Criteria API — программно-строимые типобезопасные запросы.
- Specification — шаблон для построения динамических запросов с множеством условий.
-
- QueryDSL — внешняя библиотека, генерирующая типобезопасные запросы.
Все эти подходы позволяют создавать гибкие, читаемые и поддерживаемые SQL-запросы даже с десятками параметров и условий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Слышал ли что то про метод intern?
Метод
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.
🚩Как работает `intern()`?
Без
С
🚩Что такое `String Pool`?
Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы (
🚩Когда использовать `intern()`?
Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
Ставь 👍 и забирай 📚 Базу знаний
Метод
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
}
Ставь 👍 и забирай 📚 Базу знаний
👍6🔥1
🤔 Как можно и как лучше конфигурировать контекст?
Варианты конфигурации:
- Через аннотации (@Configuration , @Bean ) — современный способ.
- Через XML — классический, устаревающий.
- Через Java DSL (Spring Boot auto config).
- Через свойства (application.yml, application.properties ).
Лучше всего — аннотации + Spring Boot автоконфигурация.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Варианты конфигурации:
- Через аннотации (
- Через XML — классический, устаревающий.
- Через Java DSL (Spring Boot auto config).
- Через свойства (application.yml,
Лучше всего — аннотации + Spring Boot автоконфигурация.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍9
🤔 К какой категории сущности относится Primary Key?
Primary Key (первичный ключ) в базах данных относится к категории ограничений (constraints). Это специальное ограничение, которое накладывается на столбец или группу столбцов таблицы, чтобы однозначно идентифицировать каждую строку (запись) в таблице.
🚩Основные свойства Primary Key
🟠Уникальность
Значение первичного ключа должно быть уникальным для каждой строки. Это исключает дублирование записей.
🟠Не может быть NULL
Столбец (или столбцы), определённый как Primary Key, не допускает значения NULL, так как NULL не может однозначно идентифицировать строку.
🟠Только один Primary Key на таблицу
Таблица может иметь только один первичный ключ, но он может состоять из одного столбца (простой ключ) или нескольких (составной ключ).
🚩Зачем нужен Primary Key?
Для однозначной идентификации записей в таблице.
Для создания связей между таблицами в реляционных базах данных (внешние ключи ссылаются на первичный ключ другой таблицы).
Для ускорения поиска и манипуляций с данными за счёт создания индекса на столбец первичного ключа.
🚩Пример использования Primary Key
Простой первичный ключ
Составной первичный ключ
Ставь 👍 и забирай 📚 Базу знаний
Primary Key (первичный ключ) в базах данных относится к категории ограничений (constraints). Это специальное ограничение, которое накладывается на столбец или группу столбцов таблицы, чтобы однозначно идентифицировать каждую строку (запись) в таблице.
🚩Основные свойства Primary Key
🟠Уникальность
Значение первичного ключа должно быть уникальным для каждой строки. Это исключает дублирование записей.
🟠Не может быть NULL
Столбец (или столбцы), определённый как Primary Key, не допускает значения NULL, так как NULL не может однозначно идентифицировать строку.
🟠Только один Primary Key на таблицу
Таблица может иметь только один первичный ключ, но он может состоять из одного столбца (простой ключ) или нескольких (составной ключ).
🚩Зачем нужен Primary Key?
Для однозначной идентификации записей в таблице.
Для создания связей между таблицами в реляционных базах данных (внешние ключи ссылаются на первичный ключ другой таблицы).
Для ускорения поиска и манипуляций с данными за счёт создания индекса на столбец первичного ключа.
🚩Пример использования Primary Key
Простой первичный ключ
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
Составной первичный ключ
CREATE TABLE Orders (
order_id INT,
product_id INT,
PRIMARY KEY (order_id, product_id)
);
Ставь 👍 и забирай 📚 Базу знаний
👍11
🤔 Что такое visibility?
Visibility (видимость) — это свойство, описывающее, когда изменения, сделанные одним потоком, становятся видимыми для других потоков. Без специальных мер изменения могут быть невидимыми из-за кэширования или оптимизаций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Visibility (видимость) — это свойство, описывающее, когда изменения, сделанные одним потоком, становятся видимыми для других потоков. Без специальных мер изменения могут быть невидимыми из-за кэширования или оптимизаций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6👍3
🤔 Чем отличаются Web server и Application server?
🟠Web Server (веб-сервер)
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
🟠Application Server (сервер приложений)
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.
🚩Web Server (веб-сервер)
Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт
Браузер отправляет HTTP-запрос:
Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл
Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.
🚩Application Server (сервер приложений)
Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на
Браузер отправляет HTTP-запрос:
Ставь 👍 и забирай 📚 Базу знаний
🟠Web Server (веб-сервер)
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
🟠Application Server (сервер приложений)
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.
🚩Web Server (веб-сервер)
Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт
example.com/index.html: Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com
Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл
index.html. Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.
🚩Application Server (сервер приложений)
Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на
example.com/login: Браузер отправляет HTTP-запрос:
POST /login HTTP/1.1
Host: example.com
Ставь 👍 и забирай 📚 Базу знаний
👍5🔥1
🤔 Каким образом можно обработать исключения?
Обработка исключений в Java осуществляется с помощью конструкции try-catch-finally. Код, который может вызвать исключение, помещается в блок try. В блоке catch указывается, как следует реагировать на определённые типы ошибок. Блок finally, если он есть, выполняется в любом случае и обычно используется для освобождения ресурсов или выполнения завершающих операций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Обработка исключений в Java осуществляется с помощью конструкции try-catch-finally. Код, который может вызвать исключение, помещается в блок try. В блоке catch указывается, как следует реагировать на определённые типы ошибок. Блок finally, если он есть, выполняется в любом случае и обычно используется для освобождения ресурсов или выполнения завершающих операций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥1
🤔 В чем разница 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 по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
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 по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Как примитивные типы данных можно сравнить между собой?
Примитивы сравниваются с помощью == и !=, а также сравнительных операторов (>, <, >=, <=).
Сравнение происходит по значению, без ссылок.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Примитивы сравниваются с помощью == и !=, а также сравнительных операторов (>, <, >=, <=).
Сравнение происходит по значению, без ссылок.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍13
🤔 Расскажи что такое 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;
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍13
🤔 Что такое SessionFactory в Hibernate?
SessionFactory — это фабрика сессий (Session), создаётся один раз при запуске приложения.
Она управляет подключением к базе, кэшированием второго уровня и конфигурацией ORM.
Объекты Session, через которые идут все операции с БД, получаются из SessionFactory.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
SessionFactory — это фабрика сессий (Session), создаётся один раз при запуске приложения.
Она управляет подключением к базе, кэшированием второго уровня и конфигурацией ORM.
Объекты Session, через которые идут все операции с БД, получаются из SessionFactory.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Какая структура данных в коллекции List?
В Java интерфейс
🚩Основные реализации `List` и их структуры данных
🟠ArrayList
Динамический массив
Структура данных: массив
Быстрая индексация
🟠LinkedList
Двусвязный список
Структура данных: двусвязный список
Быстрое добавление/удаление элементов
🟠Vector
Динамический массив (синхронизирован)
Структура данных: массив (как
Устарел, используется редко из-за
Ставь 👍 и забирай 📚 Базу знаний
В Java интерфейс
List представляет упорядоченную коллекцию элементов, допускающую дубликаты. В зависимости от конкретной реализации (ArrayList, LinkedList, Vector), используется разная структура данных. 🚩Основные реализации `List` и их структуры данных
🟠ArrayList
Динамический массив
Структура данных: массив
Быстрая индексация
O(1), но медленное удаление/вставка в середину O(n). List<String> list = new ArrayList<>();
🟠LinkedList
Двусвязный список
Структура данных: двусвязный список
Быстрое добавление/удаление элементов
O(1), но медленный доступ по индексу O(n). List<String> list = new LinkedList<>();
🟠Vector
Динамический массив (синхронизирован)
Структура данных: массив (как
ArrayList), но с синхронизацией. Устарел, используется редко из-за
synchronized методов (медленнее ArrayList). List<String> list = new Vector<>();
Ставь 👍 и забирай 📚 Базу знаний
👍7💊2
🤔 В чём разница локальной переменной и переменной, которая относится к объекту?
- Локальная переменная:
- Объявлена внутри метода.
- Существует только во время выполнения метода.
- Переменная объекта (поля):
- Объявлена в классе.
- Живёт всё время, пока объект существует.
- Может иметь модификаторы доступа и быть доступной вне метода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Локальная переменная:
- Объявлена внутри метода.
- Существует только во время выполнения метода.
- Переменная объекта (поля):
- Объявлена в классе.
- Живёт всё время, пока объект существует.
- Может иметь модификаторы доступа и быть доступной вне метода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1💊1
🤔 Чем отличается where от having ?
WHERE и HAVING используются для фильтрации записей, но они применяются на разных этапах выполнения запроса и имеют разные цели.
🚩WHERE
Применяется до агрегации данных. Это значит, что фильтрация происходит непосредственно на строках исходной таблицы или результата объединения таблиц, до того как произойдет любая операция группировки (
Используется для фильтрации строк, которые будут включены в результаты группировки или в финальный набор данных, если группировка не используется.
Не может использоваться для фильтрации агрегированных значений.
🚩HAVING
Применяется после агрегации данных. Это означает, что фильтрация происходит уже на агрегированных результатах, полученных после применения
Используется для фильтрации групп в результате запроса с группировкой.
Может использоваться только с
Ставь 👍 и забирай 📚 Базу знаний
WHERE и HAVING используются для фильтрации записей, но они применяются на разных этапах выполнения запроса и имеют разные цели.
🚩WHERE
Применяется до агрегации данных. Это значит, что фильтрация происходит непосредственно на строках исходной таблицы или результата объединения таблиц, до того как произойдет любая операция группировки (
GROUP BY) или агрегирования (SUM, COUNT, AVG и т.д.).Используется для фильтрации строк, которые будут включены в результаты группировки или в финальный набор данных, если группировка не используется.
Не может использоваться для фильтрации агрегированных значений.
SELECT employee_id, SUM(salary)
FROM salaries
WHERE salary > 1000
GROUP BY employee_id;
🚩HAVING
Применяется после агрегации данных. Это означает, что фильтрация происходит уже на агрегированных результатах, полученных после применения
GROUP BY и агрегатных функций.Используется для фильтрации групп в результате запроса с группировкой.
Может использоваться только с
GROUP BY или для фильтрации результатов, полученных с помощью агрегатных функций.SELECT employee_id, SUM(salary)
FROM salaries
GROUP BY employee_id
HAVING SUM(salary) > 10000;
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Зачем нужен Spring?
Spring упрощает разработку приложений, обеспечивая:
- Инверсию управления (IoC);
- Упрощение работы с БД;
- Создание REST API;
- Аспектно-ориентированное программирование (AOP);
- Безопасность приложений (Spring Security).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Spring упрощает разработку приложений, обеспечивая:
- Инверсию управления (IoC);
- Упрощение работы с БД;
- Создание REST API;
- Аспектно-ориентированное программирование (AOP);
- Безопасность приложений (Spring Security).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍11🔥2
🤔 Где в обработке исключений может применяться конструкция с 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(); // Всегда закрываем файл
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍4🤔1