🤔 Что означают отношения "являюсь" и "имею" в ООП?
- "Являюсь" (is-a) — отношение наследования:
- Кошка is-a Животное → class Cat extends Animal.
- "Имею" (has-a) — отношение композиции/агрегации:
- Машина has-a Двигатель → class Car { Engine engine; }.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- "Являюсь" (is-a) — отношение наследования:
- Кошка is-a Животное → class Cat extends Animal.
- "Имею" (has-a) — отношение композиции/агрегации:
- Машина has-a Двигатель → class Car { Engine engine; }.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍9🔥3
🤔 Является ли коллекция HashMap потоком безопасной?
Коллекция
🟠
Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
🟠
Предоставляет потокобезопасную реализацию карты без блокировки всей карты.
Ставь 👍 и забирай 📚 Базу знаний
Коллекция
HashMap не является потокобезопасной. Это означает, что при одновременном доступе к нему из нескольких потоков без должной синхронизации могут возникнуть проблемы, такие как потеря данных, гонки за данные и другие виды состояний гонки. Если один поток изменяет ее структуру (например, добавляя или удаляя элементы), в то время как другой поток итерирует по ней или также пытается внести изменения, результаты могут быть непредсказуемыми.🟠
Collections.synchronizedMap(Map)Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
🟠
ConcurrentHashMapПредоставляет потокобезопасную реализацию карты без блокировки всей карты.
ConcurrentHashMap разработан для высокой конкуренции и эффективности при доступе из множества потоков, обеспечивая лучшую производительность по сравнению с synchronizedMap. ConcurrentHashMap позволяет одновременно читать данные из карты несколькими потоками без блокировки и записывать данные при минимальной блокировке.Map<String, String> concurrentMap = new ConcurrentHashMap<>();
Ставь 👍 и забирай 📚 Базу знаний
👍10
🤔 Что означает LoadFactor?
LoadFactor — это порог заполнения хеш-таблицы, при котором происходит расширение (rehash).
По умолчанию 0.75, то есть при заполнении 75% бакетов таблица увеличивается вдвое, чтобы избежать коллизий и деградации производительности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
LoadFactor — это порог заполнения хеш-таблицы, при котором происходит расширение (rehash).
По умолчанию 0.75, то есть при заполнении 75% бакетов таблица увеличивается вдвое, чтобы избежать коллизий и деградации производительности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥4
🤔 Что знаешь про поверхностное копирование?
Поверхностное копирование (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;
}
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Как осуществить быстрый поиск без сортировки int массива на миллионы значений?
- использовать хеш-таблицу (если нужна проверка наличия);
- применять бинарный поиск, если данные отсортированы;
- если нет — использовать Set, Map, или хешированную структуру для O(1) поиска.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- использовать хеш-таблицу (если нужна проверка наличия);
- применять бинарный поиск, если данные отсортированы;
- если нет — использовать Set, Map, или хешированную структуру для O(1) поиска.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊15
🤔 В чем разница 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